首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >curl openssl即使添加到curl bundle.crt中也不能验证IIS 7自签名证书。

curl openssl即使添加到curl bundle.crt中也不能验证IIS 7自签名证书。
EN

Stack Overflow用户
提问于 2013-08-28 22:55:45
回答 2查看 3.6K关注 0票数 2

我在2008上使用IIS 7生成用于IIS的自签名证书(基本上是单击按钮)。

但是,即使当我导出此证书并将其添加到windows客户端的curl bundle.crt中时,无论是它还是openssl.exe都不会正确地验证证书:

代码语言:javascript
复制
openssl s_client -CAfile curl-ca-bundle.crt -showcerts -connect myserver.ad.pri:443

CONNECTED(00000003)
depth=0 /CN=myserver.ad.pri
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 /CN=myserver.ad.pri
verify error:num=21:unable to verify the first certificate
verify return:1
---
Certificate chain
 0 s:/CN=myserver.ad.pri
   i:/CN=myserver.ad.pri
-----BEGIN CERTIFICATE-----
MIIDADCCAeigAwIBAgIQTi9gdBLdo6pJ1h4Zljr/wzANBgkqhkiG9w0BAQUFADAp
....
-----END CERTIFICATE-----
---
Server certificate
subject=/CN=myserver.ad.pri
issuer=/CN=myserver.ad.pri
---
No client certificate CA names sent
---
SSL handshake has read 924 bytes and written 444 bytes
---
New, TLSv1/SSLv3, Cipher is AES128-SHA
Server public key is 2048 bit
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : AES128-SHA
    Session-ID: 

    Session-ID-ctx:
    Master-Key: 
    Key-Arg   : None
    Start Time: 1377728216
    Timeout   : 300 (sec)
    Verify return code: 21 (unable to verify the first certificate)
---
read:errno=104

我使用IE将证书导出到Base-64编码,这是openssl可读的PEM: openssl x509 -inform PEM -in myserver.crt -text。

代码语言:javascript
复制
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            4e:2f:60:74:12:dd:a3:aa:49:d6:1e:19:96:3a:ff:c3
        Signature Algorithm: sha1WithRSAEncryption
        Issuer: CN=myserver.ad.pri
        Validity
            Not Before: Aug 26 15:38:46 2013 GMT
            Not After : Aug 26 00:00:00 2014 GMT
        Subject: CN=myserver.ad.pri
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (2048 bit)
                Modulus (2048 bit):
                    ....
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Key Usage:
                Key Encipherment, Data Encipherment
            X509v3 Extended Key Usage:
                TLS Web Server Authentication
    Signature Algorithm: sha1WithRSAEncryption
        ...
-----BEGIN CERTIFICATE-----
....

具有相同curl bundle.crt的openssl/curl将验证来自google.com:443等的证书。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-09 20:40:30

我也遇到了这个问题(我很惊讶更多的人没有)。当我无法获得一个NodeJS HTTP(s)客户端连接到一个带有自签名证书的IIS实例时(一个是通过IIS管理器创建的),我就得到了可怕的‘无法验证第一个证书错误的’!

这似乎是因为IISManager为此目的创建的证书指定了一些“密钥使用”扩展;“密钥加密”和“数据加密”。

结果发现,当openssl遇到指定“密钥使用”但未能指定“certSign”使用的证书时,openssl代码会将该证书折扣为可能的CA证书,即使该证书已正确地提供给openssl代码(这意味着它无法根据所述缺席CA验证证书!)。

(参见这里的逻辑,purp.c#L503 )

解决方案就像上面提到的那样,就是用正确的密钥用法创建自己的证书(或者没有密钥使用扩展!)

我还认为,我应该包括一种创建自签名证书的替代方法,如果您在windows中,openssl客户端将对此感到满意。

首先从这里下载powershell脚本

在powershell控制台(管理)中,从包含下载脚本的文件夹中执行以下命令

代码语言:javascript
复制
New-SelfsignedCertificateEx -StoreLocation "LocalMachine" -KeyUsage "DigitalSignature,KeyEncipherment,KeyCertSign" -Subject "CN=<HOST_NAME_TO_USE>" -FriendlyName "<HOST_NAME_TO_USE>" -SignatureAlgorithm sha256 -SubjectAlternativeName "<HOST_NAME_TO_USE>","anotherhost.org","someotherdomain.com"

执行上述命令后,LocalMachine\Personal证书存储区将包含IIS可用于其SSL通信的自签名证书。(请注意,您可能还需要将此证书复制到受信任的根存储区之一,以确保该证书在该计算机上是可信的)

票数 5
EN

Stack Overflow用户

发布于 2013-08-30 18:56:32

我通过使用OpenSSL创建一个自签名的CA证书来解决这个问题,然后创建了一个服务器证书请求(也是在openssl中,出于某种原因,openssl不喜欢签署由IIS生成的请求),用以前的CA证书对其签名,然后导出到PKCS12。然后导入IIS。一旦CA证书添加到curl bundle.crt中,它将正确地验证该链:

生成CA:

代码语言:javascript
复制
openssl req -new -x509 -days 3650 -extensions v3_ca \
-keyout cakey.pem -out cacert.pem -config /etc/ssl/openssl.cnf \
-newkey rsa:2048

生成服务器密钥和签名请求:

代码语言:javascript
复制
openssl req -new -nodes -out server-csr.pem -keyout server-key.pem -newkey rsa:2048

使用CA签署请求:

代码语言:javascript
复制
openssl ca -config /etc/ssl/openssl.cnf -cert cacert.pem -keyfile cakey.pem \
-out server-cert.pem -in server-csr.pem

将服务器证书导出到PKCS#12:

代码语言:javascript
复制
openssl pkcs12 -export -out server-key-cert.pfx \
-inkey server-key.pem -in server-cert.pem -certfile cacert.pem

将服务器-key-cert.pfx导入IIS。(Re)将站点绑定的SSL绑定绑定到证书。

将cacert.pem附加到客户的curl bundle.crt中。openssl s_client -showcerts -CAfile curl bundle.crt -connect服务器:443具有深度0和1,并将验证返回。

Notes:确保keyUsage = nonRepudiation、digitalSignature、keyEncipherment在openssl.cnf Notes请求中的usr_cert部分下启用,不会包含这些keyUsage,并且IIS会抱怨绑定。

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

https://stackoverflow.com/questions/18499636

复制
相关文章

相似问题

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