3

SSLを使用してsub.domain.comで実行されるNode.jsサーバーがあります。デスクトップブラウザでは何ヶ月も完全に機能していますが、モバイルブラウザでは機能しないことに気づきました。

私は少し調査を行いましたが、証明書チェーンに問題があることを示唆する人がたくさんいます。コードを変更して、あるように見せましたが、それでも運がありません。

これが私のコードです:

var httpsOptions = {
    ca: [fs.readFileSync("certrequest.csr")],
    key: fs.readFileSync("privatekey.pem"),
    cert: fs.readFileSync("certificate.pem")
};

var app = http.createServer(httpsOptions, function(req, res) {
    log.cnsl.write("HTTP Request received from " + req.connection.remoteAddress);
        //Do stuff
});

このコマンドを実行してデバッグ情報を表示しています(サーバーはポート5673で実行されています)。

openssl s_client -connect sub.domain.com:5673 -showcerts | grep "^ "

以下はその出力の重要な部分です

depth=0 O = *.domain.com, OU = Domain Control Validated, CN = *.domain.com
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 O = *.domain.com, OU = Domain Control Validated, CN = *.domain.com
verify error:num=27:certificate not trusted
verify return:1
depth=0 O = *.domain.com, OU = Domain Control Validated, CN = *domain.com
verify error:num=21:unable to verify the first certificate
verify return:1
4

1 に答える 1

5

証明書要求ファイル「certrequest.csr」をCAとして配置したのはかなり奇妙に聞こえます。

CAフィールドには、個人証明書からルート証明書までの証明書チェーンが含まれている必要があります。私の構成では、2つのエントリが含まれています。1つはルート証明書自体として、もう1つは中間証明書として使用します。これは、発行者が複数のレベルの証明書を提供しているためです。

ちなみに、あなたの認証会社は、たとえば、FAQでそのような情報を確実に提供しています。

例として、これが私の構成の抜粋です:

var httpsOptions = {
    key:fs.readFileSync('/etc/ssl/private/ssl-main.key'),
    cert:fs.readFileSync('/etc/ssl/private/ssl-main.crt'),
    ca:[fs.readFileSync('/etc/ssl/private/ca.pem'),
        fs.readFileSync('/etc/ssl/private/sub.class2.server.ca.pem')]
};

とにかく、これはそれが非モバイルブラウザで動作する理由を説明していません。私の唯一の推測は、携帯電話がディスク容量の理由でそうしない間、彼らは私自身をチェーンの一部に埋め込んでいるということです。

お役に立てれば。

于 2012-07-16T01:53:03.840 に答える