- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
所以我正在编写一个需要使用客户端证书(相互身份验证)向服务器进行身份验证的应用程序。客户端证书 key 存储在 HSM(Gemalto 的)中。我将 OpenSSL 与 Luna 客户端集成,但请求模块需要一个文件:
from requests import Session
session: Session = Session()
session.cert = (
"/ssl/client.pem",
"/ssl/client.key"
)
session.verify = "/ssl/server.pem"
我的问题是当私钥在 HSM 中时,我找不到绑定(bind)私钥的方法。这是我到目前为止对 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 代码中。
提前致谢!
最佳答案
我已经测试了几乎所有的 Python 包装器来做同样的事情。PyKCS11 并不是很可靠。
我建议使用以下两种可能性之一:
<强>1。 PyCurl
当您正确配置 OpenSSL 和 cURL 时,cUrl 的 Python 包装器可以执行此操作。
这是一个简单的实现:
import pycurl
from io import BytesIO
import pprint
import json
c = pycurl.Curl()
url = 'https://yourserver/endpoint'
c.setopt(pycurl.URL, url)
# set proxy-insecure
c.setopt(c.SSL_VERIFYPEER, 0)
c.setopt(c.SSL_VERIFYHOST, False)
c.setopt(c.VERBOSE, 0)
c.setopt(pycurl.SSLENGINE, 'pkcs11')
c.setopt(pycurl.SSLCERTTYPE, 'eng')
c.setopt(pycurl.SSLKEYTYPE, 'eng')
c.setopt(pycurl.SSLCERT, 'pkcs11:model=XXX;manufacturer=YYYYY;serial=ZZZZ;'
'token=AAAAA;id=BBBBBBBBB;'
'object=CCCCCC;type=cert;pin-value=pin-pin')
c.setopt(pycurl.SSLKEY, 'pkcs11:model=XXX;manufacturer=YYYYY;serial=ZZZZ;'
'token=AAAAA;id=BBBBBBBBB;'
'object=CCCCCC;type=private;pin-value=pin-pin')
# set headers
c.setopt(pycurl.HEADER, True)
# c.setopt(pycurl.USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0) Gecko/20100101 Firefox/8.0')
c.setopt(pycurl.HTTPHEADER, ("HEADER_TO_ADD:VALUE",))
buffer = BytesIO()
c.setopt(c.WRITEDATA, buffer)
c.perform()
# HTTP response code, e.g. 200.
print('>>> Status: %d' % c.getinfo(c.RESPONSE_CODE))
# Elapsed time for the transfer.
print('>>> Time: %f' % c.getinfo(c.TOTAL_TIME))
# getinfo must be called before close.
c.close()
body = buffer.getvalue().decode('utf-8')
print('>>> Body:\n', body)
if body.find('{') >= 0:
body = body[body.find('{'):]
dictionary = json.loads(body)
pprint.pprint(dictionary)
请注意,pkcs#11 URI 方案必须符合 RFC7512可以使用以下命令发现它:
p11tool --provider=/usr/lib/libeTPkcs11.so --list-all
包括 pin 在内的所有字段都必须经过 url 编码。使用在线网站编码/解码字符串(pin)<->url_encoded
<强>2。 M2加密
在我看来,这是为 Python 完成的最佳 pkcs#11 实现。由于 requests.Session.mount 方法和 requests.adapters.BaseAdapter,它允许覆盖 urllib2 和请求调用。
我在这里放了一些代码以将其与 urllib2 一起使用:
from M2Crypto import m2urllib2 as urllib2
from M2Crypto import m2, SSL, Engine
# load dynamic engine
e = Engine.load_dynamic_engine("pkcs11", "/usr/lib/x86_64-linux-gnu/engines-1.1/libpkcs11.so")
pk = Engine.Engine("pkcs11")
pk.ctrl_cmd_string("MODULE_PATH", "/usr/lib/libeTPkcs11.so")
m2.engine_init(m2.engine_by_id("pkcs11"))
pk.ctrl_cmd_string("PIN", 'pin-pin')
cert = pk.load_certificate('pkcs11:model=XXX;manufacturer=YYYYY;serial=ZZZZ;'
'token=AAAAA;id=BBBBBBBBB;'
'object=CCCCCC')
key = pk.load_private_key('pkcs11:model=XXX;manufacturer=YYYYY;serial=ZZZZ;'
'token=AAAAA;id=BBBBBBBBB;'
'object=CCCCCC', pin='pin-pin')
ssl_context = SSL.Context('tls')
ssl_context.set_cipher_list('EECDH+AESGCM:EECDH+aECDSA:EECDH+aRSA:EDH+AESGCM:EDH+aECDSA:EDH+aRSA:!SHA1:!SHA256:!SHA384:!MEDIUM:!LOW:!EXP:!aNULL:!eNULL:!PSK:!SRP:@STRENGTH')
ssl_context.set_default_verify_paths()
ssl_context.set_allow_unknown_ca(True)
SSL.Connection.postConnectionCheck = None
m2.ssl_ctx_use_x509(ssl_context.ctx, cert.x509)
m2.ssl_ctx_use_pkey_privkey(ssl_context.ctx, key.pkey)
opener = urllib2.build_opener(ssl_context)
urllib2.install_opener(opener)
url = 'https://yourserver/endpoint'
content = urllib2.urlopen(url=url).read()
# content = opener.open(url)
print(content)
请注意,对于 PyCurl,我们不会在 pkcs#11 URI 中指示类型和 pin。当传递给 load_private_key 时,PIN 表示为字符串而不是 url 编码。
最后,我为 HttpAdapter 找到了一个很好的实现来挂载请求以进行调用。 Here是原始实现。
我添加了一些行来支持 PIN 码并禁用检查主机名:
M2Crypto.SSL.Connection.postConnectionCheck = None
下面是如何安装适配器:
from requests import Session
from m2requests import M2HttpsAdapter
import pprint, json
request = Session()
m2httpsadapter = M2HttpsAdapter()
# Added by me to set a pin when loading private key
m2httpsadapter.pin = 'pin-pin'
# Need this attribute set to False else we cannot use direct IP (added by me to disable checking hostname)
m2httpsadapter.check_hostname = False
request.mount("https://", m2httpsadapter)
request.cert=('pkcs11:model=XXX;manufacturer=YYYYY;serial=ZZZZ;'
'token=AAAAA;id=BBBBBBBBB;'
'object=CCCCCC',
'pkcs11:model=XXX;manufacturer=YYYYY;serial=ZZZZ;'
'token=AAAAA;id=BBBBBBBBB;'
'object=CCCCCC')
headers = {'HEADER_TO_ADD_IF_WANTED': 'VALUE', }
r = request.get("https://yourserver/endpoint", headers=headers, verify=False)
print(r.status_code)
pprint.pprint(json.loads(r.raw.data.decode('utf-8')))
关于python - HSM 与 Python 请求模块的集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57976489/
我有一些私钥存储在 HSM 中,但没有公钥。我想通过PKCS11接口(interface)获取对应的公钥。 如果私钥是RSA key ,我可以从CKA_MODULUS中提取模数,从CKA_PUBLIC
收到CKR_GENERAL_ERROR当应用程序尝试打开与 H/W HSM 的连接时。 详细的错误是: 50004-Crypto API could not be open. Caused by: x
HSM 服务器和客户端设置已在我这边完成,我的问题是如何在没有 HSM 客户端的情况下与 HSM 服务器进行通信以通过 java 应用程序访问 Luna key 存储,是否有其他方法可以在没有客户端的
我想简要了解硬件/主机安全模块中的区域主 key 或区域控制主 key 。有人可以解释一下吗? 最佳答案 区域主 key (ZMK)只是另一个 Des key 。它用于在 HSM 之间传输 key 。
使用 HSM 命令 A0(生成 key ),我得到以下响应。 HEADA100U7D4213E0422F4E08E9455D9837E09FDDRA0072B1TX00S000073C35FF96F7
我在互联网上发现 HSM 是存储 key 的最佳位置,但我还有很多悬而未决的问题。服务器、HSM 和数据库之间如何进行交互?。是不是就像服务器从 HSM 检索 key 来解密数据库中的数据一样?如果我
我试图了解如何使用终端将 hsm 和 key 链接到交易。我应该开发一个身份验证服务器,它从终端接收交易并解析它们以获取不同的数据。但我不明白的是如何使用 hsm 来保护数据。 最佳答案 首先您必须了
我正在研究 HSM,我有一个问题。 在 HSM(对于所有系统)中,是否只有一种当前状态?例如; 在我的项目中,有两种用户类型:普通用户和技术人员用户。它们之间没有相同之处。普通用户可以随时登录系统和注
我正在尝试使用 python 代码向 HSM (Thales paysheild 9000) 发送命令。但我从代码中得到的响应并不符合预期。 Input: HEADJA12345678912306 #
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
我引用以下文档: How to generate and transfer HSM-protected keys for Azure Key Vault 先决条件之一是: Thales HSM、智能卡
我工作并完成了一个 PKI 项目,该项目使用 HSM 来生成 - 存储 key 和执行加密功能。我使用 PKCS#11 与我们的应用程序交互以进行签名/验证和加密/解密。我们的平台是windows。
我引用以下文档: How to generate and transfer HSM-protected keys for Azure Key Vault 先决条件之一是: Thales HSM、智能卡
这正是我想知道的。基于云的 HSM 很昂贵,我需要确定要支付的费用。 最佳答案 主要是公钥加密。 HSM 包含 key 对,这些 key 对可以链接回受信任的公共(public)根,这与 SSL/TL
我正在连接一个 HSM,它正在生成并使用以太坊标准 (secp256k1) 进行签名。我正在使用一个名为 Graphene 的包与 HSM 连接。我使用其“pointEC”属性提取公钥:0xc87c1
此代码块正在加载 cryptoki.so 库并检索插槽信息。这是获取插槽编号中的对象列表。 0. 我不需要访问所有的键来执行一些功能,只需要一个特定的键对。有没有办法通过使用标签名称、对象 ID 或句
我有一个 Thales nShield HSM,其中创建了一个(CKA_SENSATIVE,假)AES key ,我想提取该 key ,但是我根本不知道如何在 java 中执行此操作。我的 key 创
AWS 似乎允许我们将 AWS Cloud HSM 作为提供商,请参阅 here和here Security.addProvider(new com.cavium.provider.CaviumPro
所以我正在编写一个需要使用客户端证书(相互身份验证)向服务器进行身份验证的应用程序。客户端证书 key 存储在 HSM(Gemalto 的)中。我将 OpenSSL 与 Luna 客户端集成,但请求模
我正在尝试从我的计算机访问 Safenet HSM,我将我的计算机添加到客户端并将 pem 文件发送到 HSM,就在这里。问题是当我输入“vtl verify”时,因为它启动了以下错误: SSL Co
我是一名优秀的程序员,十分优秀!