1

編集済み

アプリで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ドキュメントを使用して証明書を作成しました。私が使用したプロセスは次のとおりです。

  1. 認証局のルート証明書とキーを作成する

    OPENSSL_CONF =〜/ myCA/caconfig.cnfをエクスポートします

    openssl req -x509 -newkey rsa:2048 -out cacert.pem -outform PEM -days 1825

    生成するもの:CA公開証明書'cacert.pem'; およびCA秘密鍵'cakey.pem'

  2. 自己署名サーバー証明書を作成する

    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'。

  3. クライアントで使用するために、サーバーのルート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'になります。

  4. ファイルをアプリのsslディレクトリにコピーします

    ファイル「cacert.pem」、「server_key.pem」、および「server_crt.pem」をアプリのsslディレクトリにコピーします。

  5. Firefoxの組み込みの証明書マネージャーを介してファイル「mycert.pfx」をFirefoxにインポートします(「証明書」とマークされたタブにインポートします)。

  6. https://ssl:3000Firefoxに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

私は自分が間違っていることを理解することができません。誰かが私を正しい方向に向けてくれたら、私は非常にありがたいです。

4

1 に答える 1

0

最近、SSLをサポートする単純なプロキシサーバーをnode.jsに実装しました。たぶんそれはあなたがあなたのソリューションをデバッグするのを助けることができます。自己署名証明書を生成するためのコードと簡単な手順は、私のGithubプロジェクト(https://github.com/alienhard/malinger)にあります。

于 2012-07-18T05:10:31.920 に答える