我正在尝试创建一个x.509证书,但我一直遇到错误OPENSSL_Uplink(00007FF944EF2000,08): no OPENSSL_Applink
,如下所示。我不知道该怎么做。
当我四处搜寻时,我发现有人建议用"BIO“打开文件,但我不知道该怎么做.任何帮助都将不胜感激。
import time
from M2Crypto import X509, EVP, RSA, ASN1
KeyLength=2048
CAName='TS.CN'
ServerName='CF.CN'
CAKeyFile='ca.key'
CACerFile='ca.cer'
ServerKeyFile='server.key'
ServerCerFile='Server.cer'
def mk_ca_issuer():
"""
Our default CA issuer name.
"""
issuer = X509.X509_Name()
issuer.C = 'CN'
issuer.CN = CAName
issuer.ST = 'TS'
issuer.L = 'TS'
issuer.O = 'TS'
issuer.OU = 'TS'
return issuer
def mk_cert_valid(cert, days=365):
"""
Make a cert valid from now and til 'days' from now.
Args:
cert -- cert to make valid
days -- number of days cert is valid for from now.
"""
t = long(time.time())
now = ASN1.ASN1_UTCTIME()
now.set_time(t)
expire = ASN1.ASN1_UTCTIME()
expire.set_time(t + days * 24 * 60 * 60)
cert.set_not_before(now)
cert.set_not_after(expire)
def mk_request(bits, cn='CF.CN'):
"""
Create a X509 request with the given number of bits in they key.
Args:
bits -- number of RSA key bits
cn -- common name in the request
Returns a X509 request and the private key (EVP)
"""
pk = EVP.PKey()
x = X509.Request()
rsa = RSA.gen_key(bits, 65537, lambda: None)
pk.assign_rsa(rsa)
x.set_pubkey(pk)
name = x.get_subject()
name.C = 'CN'
name.CN = cn
name.ST = 'TS'
name.O = 'TS'
name.OU = 'TS'
x.sign(pk,'sha1')
return x, pk
def mk_cacert():
"""
Make a CA certificate.
Returns the certificate, private key and public key.
"""
req, pk = mk_request(KeyLength)
pkey = req.get_pubkey()
cert = X509.X509()
cert.set_serial_number(1)
cert.set_version(2)
mk_cert_valid(cert)
cert.set_issuer(mk_ca_issuer())
cert.set_subject(cert.get_issuer())
cert.set_pubkey(pkey)
cert.add_ext(X509.new_extension('basicConstraints', 'CA:TRUE'))
cert.add_ext(X509.new_extension('subjectKeyIdentifier', cert.get_fingerprint()))
cert.sign(pk, 'sha1')
return cert, pk, pkey
def mk_cert():
"""
Make a certificate.
"""
cert = X509.X509()
cert.set_serial_number(2)
cert.set_version(2)
mk_cert_valid(cert)
cert.add_ext(X509.new_extension('nsComment', 'SSL sever'))
return cert
def mk_casigned_cert():
"""
Create a CA cert + server cert + server private key.
"""
# unused, left for history.
cacert, pk1, _ = mk_cacert()
cert_req, pk2 = mk_request(KeyLength, cn=ServerName)
cert = mk_cert()
cert.set_issuer(cacert.get_issuer())
cert.set_subject(cert_req.get_subject())
cert.set_pubkey(cert_req.get_pubkey())
cert.sign(pk1, 'sha1')
return cacert, cert,pk1, pk2
if __name__ == '__main__':
cacert, cert, pk1,pk2 = mk_casigned_cert()
with open(CACerFile, 'w') as f:
f.write(cacert.as_pem())
with open(ServerCerFile, 'w') as f:
f.write(cert.as_pem())
with open(CAKeyFile, 'w') as f:
f.write(pk1.as_pem(None))
with open(ServerKeyFile, 'w') as f:
f.write(pk2.as_pem(None))
# Sanity checks...
cac = X509.load_cert(CACerFile)
print cac.verify(), cac.check_ca()
cc = X509.load_cert(ServerCerFile)
print cc.verify(cac.get_pubkey())
发布于 2017-08-25 19:16:14
来自主题为OpenSSL 我在Windows下编译了一个程序,它崩溃了的我在Windows下编译了一个程序,它崩溃了常见问题
这通常是因为您错过了INSTALL.W32中的评论。您的应用程序必须针对链接openssl库的Win32 C-运行时的相同版本进行链接。OpenSSL的默认版本是/MD --“多线程DLL”。 如果您使用的是Microsoft ++的IDE (Visual ),在许多情况下,您的新项目很可能默认为“DebugSingle线程”- /ML。这与/MD不可互换,您的程序将崩溃,通常是在第一个与BIO相关的读或写操作中。 对于Win32中的六种可能的链接阶段配置中的每一种,您的应用程序必须根据构建OpenSSL的方法进行链接。如果您使用的是MS Visual C++ (Studio),则可以通过以下方式更改: 1.选择设置..。在“项目”菜单上。2.选择C/C++选项卡。3.从“类别”下拉列表框4中选择“代码生成”。从“使用运行时库”下拉列表框中选择适当的库(见下表)。对应用程序的调试和发布版本(查看设置面板的左上角以在这两个版本之间进行更改)执行此步骤-对于新项目的发布版本,单线程/ML - MS VC++通常默认为这一步。调试单线程的/MLd - MS VC++通常默认为新项目的调试版本。多线程/MT调试、多线程/MTd、多线程DLL、/MD - OpenSSL默认为此。调试多线程DLL /MDd 注意,调试和发布库是不可互换的。如果使用OpenSSL构建/MD,则应用程序必须使用/MD,而不能使用/MDd。 如0.9.8所示,.DLLs消除了上述限制。使用一些特定的运行时选项编译的OpenSSL .DLLs,我们坚持默认的/MD可以通过使用不同的选项甚至不同的编译器编译的应用程序来部署。但这里有个陷阱!不必像以前的版本那样重新编译OpenSSL工具包,您必须使用编译器和/或自己选择的选项来编译小的C代码段。这个代码片段被安装为/include/openssl/applink.c,并且应该添加到应用程序项目中,或者只在一个应用程序源文件中添加#include-d。未能将这个shim模块链接到您的应用程序中,其本身显示为致命的“无OPENSSL_Applink”运行时错误。一个明确的提示是,在这种情况下混合编译器选项时,在第一次调用CRYPTO_malloc_init之前添加OpenSSL同样重要。
https://stackoverflow.com/questions/45882431
复制相似问题