因此,我正在编写一个需要使用客户端证书(相互身份验证)向服务器进行身份验证的应用程序。客户端证书密钥存储在HSM(金雅拓)中。我与Luna Client进行了OpenSSL集成,但请求模块需要一个文件:

from requests import Session

session: Session = Session()

session.cert = (
    "/ssl/client.pem",
    "/ssl/client.key"
)
session.verify = "/ssl/server.pem"


我的问题是,当私钥在HSM中时,我找不到绑定私钥的方法。到目前为止,这是我尝试使用pycryptoki库的内容:

from pycryptoki.session_management import (
    c_initialize_ex,
    c_open_session_ex,
    login_ex,
    c_logout_ex,
    c_close_session_ex,
    c_finalize_ex,
)
from requests import Session

c_initialize_ex()
auth_session = c_open_session_ex(0)
login_ex(auth_session, 0, "some-pass")

session: Session = Session()

session.cert = (
    "/ssl/client.pem",
    "rsa-private-156405640312",
)
session.verify = "/ssl/server.pem"

...

c_logout_ex(auth_session)
c_close_session_ex(auth_session)
c_finalize_ex()


我已经在这里打开了一个问题,我不得不完成应用程序的实现,所以我将HSM集成搁置了,但是在投入生产之前,我需要完成这项工作:https://github.com/gemalto/pycryptoki/issues/17

我也尝试使用py-hsm,但这是一个低级的api库,我还在其中打开了一个issue,并提供了我的代码示例:

from pyhsm.hsmclient import HsmClient
from requests import Session

c = HsmClient(pkcs11_lib="/usr/lib/libCryptoki2_64.so")
c.open_session(slot=0)
c.login(pin="some-code")

session: Session = Session()
session.cert = "/ssl/client.pem"

c.logout()
c.close_session()


任何人都可以通过HSM中的证书对提供相互认证的示例吗?如果您在C / C ++中拥有某些东西,那也很好,我可以实现我的请求功能,并将其包装在我的python代码中。

先感谢您!

最佳答案

HSM中的私钥可用于对某些数据进行签名,这是您要完成的相互身份验证所要做的。签署另一方提供的某些数据,证明您控制着与证书相对应的私钥。

从HSM,您可以获取私钥的句柄,并使用该句柄执行私钥操作而无需导出密钥(使用HSM的全部原因是防止看到私钥的内容)。
HSM可以公开很多不同的接口,但是PKCS#11是迄今为止最常见的接口。您实际上不需要使用OpenSSL或使用C / C ++进行编程。由于您使用的是Python请求,因此可以使用一些PKCS#11 Python库。

请查看以下Python PKCS11库:https://github.com/danni/python-pkcs11

然后,您可以做类似的事情(假设密钥是RSA)

import pkcs11

lib = pkcs11.lib("/usr/lib/libCryptoki2_64.so")
token = lib.get_token(token_label='DEMO')

# Open a session on our token
with token.open(user_pin='1234') as session:
    # Get the key from the HSM by label
    priv = session.get_key(
            object_class=pkcs11.constants.ObjectClass.PRIVATE_KEY,
            label='key_label')
    # sign with that key using the required mechanism:
    signature = priv.sign(my_to_be_signed_data, mechanism=pkcs11.Mechanism.SHA256_RSA_PKCS)



您没有提供有关此相互身份验证的许多详细信息,但是希望,这可以使您走上正确的道路。上面的代码根据标签检索密钥,但是此PKCS#11库还支持基于许多其他属性在HSM中查找密钥。

关于python - HSM与Python请求模块集成,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57976489/

10-12 18:36