首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python没有OPENSSL_Applink

Python没有OPENSSL_Applink
EN

Stack Overflow用户
提问于 2017-08-25 13:21:02
回答 1查看 2.3K关注 0票数 1

我正在尝试创建一个x.509证书,但我一直遇到错误OPENSSL_Uplink(00007FF944EF2000,08): no OPENSSL_Applink,如下所示。我不知道该怎么做。

当我四处搜寻时,我发现有人建议用"BIO“打开文件,但我不知道该怎么做.任何帮助都将不胜感激。

代码语言:javascript
运行
复制
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())
EN

回答 1

Stack Overflow用户

发布于 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同样重要。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45882431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档