Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用python加载pkcs12密钥库_Python_Pyopenssl - Fatal编程技术网

如何使用python加载pkcs12密钥库

如何使用python加载pkcs12密钥库,python,pyopenssl,Python,Pyopenssl,我用java创建了一个pkcs12密钥库,在这里我存储了两个密钥,现在我想用python检索这些密钥。在JavaL中加载密钥库并使用keystore.getkey(keyalias)。我怎样才能用python做到这一点 我第一次尝试pyjks,但它不支持pkcs12密钥库 然后我试过了,但文档中没有提到加载现有密钥库的方法 我还从一篇旧帖子中找到了这段代码: 但是get_privatekey()不接受args,这意味着它不能像在java中一样设置要检索的密钥别名: public static

我用java创建了一个pkcs12密钥库,在这里我存储了两个密钥,现在我想用python检索这些密钥。在JavaL中加载密钥库并使用keystore.getkey(keyalias)。我怎样才能用python做到这一点

  • 我第一次尝试pyjks,但它不支持pkcs12密钥库
  • 然后我试过了,但文档中没有提到加载现有密钥库的方法
  • 我还从一篇旧帖子中找到了这段代码:
但是get_privatekey()不接受args,这意味着它不能像在java中一样设置要检索的密钥别名:

public static SecretKey getEntry(KeyStore keyStore, String keyAlias, Optional<String> password) {
        SecretKey key = null;

        try {
            key = (SecretKey) keyStore.getKey(keyAlias, password.orElse("").toCharArray());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return key;
    }
public static SecretKey getEntry(密钥库密钥库、字符串keyAlias、可选密码){
SecretKey=null;
试一试{
key=(SecretKey)keyStore.getKey(keyalis,password.orElse(“”.toCharArray());
}捕获(例外e){
e、 printStackTrace();
}
返回键;
}

在我开始之前,有一个问题,那就是您以“秘密密钥”(也称为对称密钥)开头的两个密钥,还是它们是“私钥”

如果您的密钥是“私钥”,那么您应该能够将PKCS12密钥库转换为JKS密钥库,并使用pyjks读取私钥

要从RHEL7上的命令行转换密钥库格式,请使用以下命令:

keytool -importkeystore -srckeystore <path_to_your_pkcs12_keystore> -srcstoretype PKCS12 -deststoretype JKS -destkeystore <path_to_new_jks_keystore>
keytool -importkeystore -srckeystore <path_to_your_pkcs12_keystore> -srcstoretype PKCS12 -deststoretype JCEKS -destkeystore <path_to_new_jceks_keystore>
keytool-importkeystore-srckeystore-srcstoretype PKCS12-deststoretype JKS-destkeystore
如果您的密钥是“密钥”,则JKS格式不支持“密钥”条目类型。因此,请尝试将密钥库从PKCS12格式转换为JCEKS格式的密钥库。JCEKS格式是一种两者都适用的格式

  • 支持“密钥”条目类型
  • 声称得到pyjks的支持
要从RHEL7上的命令行转换密钥库格式,请使用以下命令:

keytool -importkeystore -srckeystore <path_to_your_pkcs12_keystore> -srcstoretype PKCS12 -deststoretype JKS -destkeystore <path_to_new_jks_keystore>
keytool -importkeystore -srckeystore <path_to_your_pkcs12_keystore> -srcstoretype PKCS12 -deststoretype JCEKS -destkeystore <path_to_new_jceks_keystore>
keytool-importkeystore-srckeystore-srcstoretype PKCS12-deststoretype JCEKS-destkeystore

这个新的JCEKS格式密钥库现在应该可以通过python使用pyjks读入了

我知道这是一篇老文章,但我想回答一个直接的问题-如何将别名传递给pyopenssl以获取私钥。我仍然认为另一个答案是一个可行的解决方案,但也许更多的背景会对一些人有所帮助


不幸的是,简短的回答是,您无法使用python在
openssl
中为特定密钥指定别名
PyOpenSSL
使用下面的代码加载
pkcs12
文件

def load_pkcs12(缓冲区,密码短语=None):
"""
从字符串*缓冲区*加载pkcs12数据。如果pkcs12结构为
加密,必须包含*密码短语*。MAC始终为
已检查,因此需要。
另请参见C函数的手册页:py:func:`PKCS12_parse`。
:param buffer:存储证书的缓冲区
:param passphrase:(可选)用于解密PKCS12包的密码
:返回:PKCS12对象
"""
... (省略了很多代码)。。。
如果证书[0]==\u ffi.NULL:
pycert=None
friendlyname=无
其他:
pycert=X509.\u来自\u原始\u X509\u ptr(证书[0])
friendlyname_length=_ffi.new(“int*”)
friendlyname\u buffer=\u lib.X509\u别名\u get0(
证书[0],friendlyname\u长度
)
friendlyname=\u ffi.buffer(
弗里恩
dlyname_缓冲区,friendlyname_长度[0]
)[:]
如果friendlyname\u buffer==\u ffi.NULL:
friendlyname=无
... (要省略更多代码)。。。
lib.X509\u alias\u get0(X509*,int*)
函数来自
cryptography
库(据我所知,它实际上是
\u openssl.lib
中的
C
函数。以下是它在and中的用法)

在任何情况下,
pyOpenSSL
的API都不允许指定别名。在他们的文档中,或者在他们的问题跟踪程序中,都没有任何建议

但是直接使用
加密
怎么样。PyOpenSSL确实警告我们,在任何情况下使用DirectAPI都是一个好主意

<stdin>:1: DeprecationWarning: PKCS#12 support in pyOpenSSL is deprecated. You should use the APIs in cryptography.
:1:不推荐使用警告:pyOpenSSL中的PKCS#12支持已不推荐使用。您应该在加密中使用API。
当然,我们可以重新执行pyOpenSSL所执行的步骤并加载
.p12
文件,但是哦,不

政府对我们有一个警告

此时解析PKCS12文件时,加密仅支持单个私钥和相关证书

事实上,我们目前似乎无法通过这些库加载具有不同别名的不同键


为什么? 我只能假设这样做的原因是因为大多数
.p12
用户只有一个证书和一个私钥,与他们文件中的一个别名匹配。也就是说,它们不使用此特定标准的功能来保存多对

我的判断是基于

但在实践中,它通常仅用于存储一个私钥及其关联的证书链

PKCS#12文件通常使用OpenSSL创建,OpenSSL只支持来自命令行界面的单个私钥


但是-如果您只有一个私钥和证书,并且仍然希望确保这些私钥和证书的别名正确,
pyOpenSSL
确实有一个方法
get\u friendlyname()
,该方法返回加载文件的别名。这对您的具体情况(OP)并没有帮助,但可以作为附加检查