編集済み
アプリでSSLを機能させようとしていますが、機能させることができません。問題のトラブルシューティングに問題があります。
私はそれをテストするための基本的なアプリを作成しました:
var https = require('https');
var fs = require('fs');
var options = {
key: fs.readFileSync('./ssl/server_key.pem'),
cert: fs.readFileSync('./ssl/server_crt.pem'),
passphrase: 'mypassphrase',
ca: fs.readFileSync('./ssl/cacert.pem'),
requestCert: true,
rejectUnauthorized: false
};
https.createServer(options, function (req, res) {
console.log('req.client.authorized: %s', req.client.authorized);
if (req.client.authorized) {
res.writeHead(200);
res.end("hello world\n");
}
else {
res.writeHead(404);
res.end("Not authorised\n");
}
}).listen(3000);
console.log('Server started...');
OpenSSLのUbuntuドキュメントを使用して証明書を作成しました。私が使用したプロセスは次のとおりです。
認証局のルート証明書とキーを作成する
OPENSSL_CONF =〜/ myCA/caconfig.cnfをエクスポートします
openssl req -x509 -newkey rsa:2048 -out cacert.pem -outform PEM -days 1825
生成するもの:CA公開証明書'cacert.pem'; およびCA秘密鍵'cakey.pem'
自己署名サーバー証明書を作成する
OPENSSL_CONF =〜/ myCA/exampleserver.cnfをエクスポートします
openssl req -newkey rsa:1024 -keyout tempkey.pem -keyform PEM -out tempreq.pem -outform PEM
mv tempkey.pem server_key.pem
OPENSSL_CONF =〜/ myCA/caconfig.cnfをエクスポートします
openssl ca -in tempreq.pem -out server_crt.pem
これにより、次のものが生成されます。サーバーアプリケーション証明書ファイル'server_crt.pem'; およびサーバーアプリケーションキーファイル'server_key.pem'。
クライアントで使用するために、サーバーのルートCAX.509証明書からPKCS#12証明書を作成します
openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout mycert.pem -out mycert.pem
openssl pkcs12 -export -out mycert.pfx -in mycert.pem -name "Certificate for MySite"
その結果、ファイル'mycert.pfx'になります。
ファイルをアプリのsslディレクトリにコピーします
ファイル「cacert.pem」、「server_key.pem」、および「server_crt.pem」をアプリのsslディレクトリにコピーします。
Firefoxの組み込みの証明書マネージャーを介してファイル「mycert.pfx」をFirefoxにインポートします(「証明書」とマークされたタブにインポートします)。
https://ssl:3000
FirefoxにURL()を入力しますこの時点で、Firefoxから「ユーザー識別要求」を受け取り、そこから証明書を選択します。次に、Firefoxから次のようなエラーが表示されます。
"...セキュア接続に失敗しましたssl:3000への接続中にエラーが発生しました。ピアの証明書に無効な署名があります。(エラーコード:sec_error_bad_signature)..."
でトラブルシューティングを試みましたがcurl -v -s -k -E mycert.pem:somepassword https://ssl:3000
、次の出力が表示されます。
- sslポート3000(#0)にconnect()しようとしています
- XXX.XXX.XXX.XXXを試しています...接続されています
- 証明書の検証場所を正常に設定しました。
- CAfile:なしCApath:/ etc / ssl / certs
- SSLv3、TLSハンドシェイク、クライアントhello(1):
- SSLv3、TLSハンドシェイク、サーバーhello(2):
- SSLv3、TLSハンドシェイク、CERT(11):
- SSLv3、TLSハンドシェイク、リクエストCERT(13):
- SSLv3、TLSハンドシェイク、サーバー終了(14):
- SSLv3、TLSハンドシェイク、CERT(11):
- SSLv3、TLSハンドシェイク、クライアントキー交換(16):
- SSLv3、TLSハンドシェイク、CERT検証(15):
- SSLv3、TLS変更暗号、クライアントhello(1):
- SSLv3、TLSハンドシェイク、終了(20):
- SSLv3、TLS変更暗号、クライアントhello(1):
- SSLv3、TLSハンドシェイク、終了(20):
- AES256-SHAを使用したSSL接続
- サーバー証明書:
- 件名:CN = ssl; ST=北京; C = CN; emailAddress = root @ localhost; O=ベングルカンパニー; OU=寝室
- 開始日:2012-07-17 05:11:49 GMT
- 有効期限:2017-07-16 05:11:49 GMT
- subjectAltName:sslが一致しました
- 発行者:CN = ssl; ST=北京; C = CN; emailAddress = root @ localhost; O=ベングルカンパニー; OU=寝室
- SSL証明書の検証結果:自己署名証明書(18)、とにかく続行します。GET / HTTP / 1.1ユーザーエージェント:curl / 7.22.0(i686-pc-linux-gnu)libcurl / 7.22.0 OpenSSL / 1.0.1 zlib / 1.2.3.4 libidn / 1.23 librtmp / 2.3ホスト:ssl:3000 Accept :/
HTTP /1.1404が見つかりません
日付:2012年7月17日火曜日05:22:04 GMT
接続:キープアライブ
転送エンコーディング:チャンク
許可されていません
- ホストsslへの接続#0はそのまま残されました
- 接続#0を閉じる
- SSLv3、TLSアラート、クライアントhello(1):
次に実行するnetstat
と、次の出力が得られます。
アクティブなインターネット接続(サーバーなし)
ProtoRecv-QSend-Qローカルアドレス外部アドレス状態
tcp 0 0 ssl:55719 ssl:3000 TIME_WAIT
私は自分が間違っていることを理解することができません。誰かが私を正しい方向に向けてくれたら、私は非常にありがたいです。