4

この特定の質問については、インターネットでの検索が非常に複雑であることがわかっています。おそらく、あなたは私を正しい方向に向けることができますか?

自己署名証明書を使用して (HTTPS ではなく) SSL/TLS サーバーをセットアップしました。私はそれに正常に接続し、Node.JSを使用してテストしました

var sock = tls.connect({
  host:'127.0.0.1',
  port:443,
  servername:'foobar',
  ca: fs.readFileSync('foobar-cert.pem')
}, function () {
  if(sock.authorized)
    console.log('secure connection - yea!')
  else
    console.log('Not Secure because ' + sock.authorizationError)
})

しかし、Java で同等のサンプル コードを見つけることができないようです。

サーバー認証用の自己署名証明書ファイルを使用して、Java で TLS サーバーに接続するにはどうすればよいですか? 自己署名証明書は実行時に読み込まれ、コンピュータの共有 CA ファイルにはインストールされません。

これまでに見つけた最良の答えには、外部ライブラリが必要です。Javaには必要なものが組み込まれており、外部ライブラリはまったく必要ないと確信しているため、これは私の最後の手段です。

編集:質問を再開する際の迅速な対応に感謝します。

編集: Java に自己署名の ssl 証明書を受け入れるように指示したことの複製として、私の質問が閉じられたようです。私の質問には、上で述べた追加の要件があるため、これは正しくありません。

  • 提案: 「証明書... JVM トラストストアにインポートする」
    私の要件は「自己署名証明書 ... コンピューターの共有 CA ファイルにインストールされていません」

  • 提案:「証明書の検証を無効にする」(推奨されません)
    私の要件「実行時に自己署名証明書がロードされる」 (およびサーバーの検証に使用される)

  • 提案: 「keytool を使用してそれをトラストストアにインポートします」
    私の要件は「自己署名証明書 ... コンピューターの共有 CA ファイルにインストールされていません」

4

2 に答える 2

4

Android でこれを行う方法 (実行時の証明書の読み取りを含む) を示すブログ投稿を少し前に書きましたが、同じコードがデスクトップでも動作するはずです。

基本的な考え方は、実行時にトラスト ストアを作成し、証明書を読み取り、それをトラスト ストアに追加することです。次に、カスタム トラスト ストアを使用して、SSLSocketFactory で使用できる SSLContext を作成します。

ブログ投稿の例では、SSLSocketFactory を URLConnection に渡していますが、SSLSocketFactory のcreateSocketメソッドを使用してソケットを取得し、それを直接操作することもできます。

于 2013-02-27T02:49:32.807 に答える
1

この巨大なドキュメントのどこかに答えがあるかもしれません:

http://download.java.net/jdk8/docs/technotes/guides/security/jsse/JSSERefGuide.html

基本的に、最初は SSLSocket を使用します。しかし、実行時に証明書を追加できるとは思いません。

于 2013-02-27T00:01:13.643 に答える