1

これが状況です。自己署名 CA 証明書を作成し、それを使用して、https で使用する 2 つ目の証明書に署名しました。Web サーバーは、SSL ターミネーションと Expressjs アプリケーションへのリバース プロキシを行う nginx です。信頼チェーンが正しいことを確認するために、Firefox に CA をインストールし、予想どおり、警告なしで https 経由で Web サイトにアクセスできました。さらに、サーバーの証明書をopenssl x509 -in server.crt -text -nooutで調べると、予想される発行者と、特にサブジェクトの予想される共通名の両方が表示されます。(注: ここで使用されている共通名は IP アドレスです。これは、問題を引き起こす可能性があるためです。)

しかし、requestjs を使用して nodejs スクリプト経由でサーバーにアクセスしようとすると、うまくいきません。スクリプトでは、次のようなコードを使用して CA 証明書が読み込まれます。

request.get({url: theUrl, ca: fs.readFileSync("./ca.crt")}, ...

しかし、私はこのエラーを受け取ります (読みやすくするために改行、オリジナルは 1 行です):

Contacting doorman failed: Error: Hostname/IP doesn't match certificate's altnames: 
"IP: <redacted> is not in the cert's list: "

「証明書のリスト」が空だと言っているように見えるのは特に疑わしいです。オプションでの使用rejectUnauthorized: falseは他の回答で提案されていますが、ID 検証が必要なため、このアプリケーションには最適なオプションではありません。

requestjs/nodejs がこの証明書を信頼するようにするにはどうすればよいですか?


によって報告されたサーバー証明書の内容openssl x509 -text

Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number: 3 (0x3)
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=US, ST=State, L=City, O=Company, CN=www.company.com
        Validity
            Not Before: Dec  7 17:19:51 2015 GMT
            Not After : Oct 14 17:19:51 2025 GMT
        Subject: C=US, ST=State, L=City, O=Company, CN=1.2.3.4/emailAddress=webmaster@company.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (4096 bit)
                Modulus:
                    ...
                Exponent: 65537 (0x10001)
    Signature Algorithm: sha256WithRSAEncryption
         ...

そして、その証明書を生成するために使用される構成ファイル:

[ req ]
default_bits       = 4096
prompt             = no
encrypt_key        = no

distinguished_name = req_distinguished_name
req_extensions     = v3_req

[ req_distinguished_name ]
countryName            = "US"
stateOrProvinceName    = "State"
localityName           = "City"
organizationName       = "Company"
commonName             = "1.2.3.4"
emailAddress           = "webmaster@company.com"

[ v3_req ]
subjectAltName = IP:1.2.3.4
4

1 に答える 1

3

ホスト名/IP が証明書の代替名と一致しません:

私の推測では、証明書には URL でサブジェクト代替名 (SAN) ではなくサブジェクト (CN) としてのみ使用される正しいホスト名が含まれていますが、SAN として他の名前が含まれていると思います。サブジェクトの代替 DNS 名が指定されている場合、CN をチェックすべきではないという標準は非常に明確ですが、ほとんどのブラウザはとにかく CN をチェックします (Safari はより厳密だと思います)。しかし、node.js は厳密な動作を実装しているため、失敗します。

私の推測が正しければ (証明書がないとわかりにくい)、正しい証明書を作成して問題を解決する必要があります。もう 1 つの可能性は、ブラウザと nodejs でわずかに異なる URL を使用することです (www接頭辞の有無など)。

編集:実際に使用する証明書を確認した後....

CN に IP アドレスを持つ証明書があります。これもほとんどのブラウザでサポートされていますが、正しくありません。IP アドレスは、CN ではなく ipadress SAN エントリとして指定する必要があります。Nodejsはそこだけを期待しており、Safariもそこまで厳しいと思います。IE の場合、この場合も標準に反して動作することを好むという理由だけで、それを CN または dnsname SAN エントリとして配置する必要があることに注意してください。したがって、安全のために、ipaddress、dnsname、およびおそらく CN としても入力してください。

于 2015-12-07T16:41:34.703 に答える