web-dev-qa-db-ja.com

javax.net.ssl.SSLPeerUnverifiedException:ホスト名が検証されていません:

自己署名証明書でHTTPS接続を使用しようとしています。
ここで述べた自己署名証明書の作成手順に従いました- 自己署名証明書の作成
ブラウザでも問題なく機能します。証明書が不明なCAによって署名されているというメッセージのみが表示されます。
しかし、証明書の生成中に間違った名前を設定したため、証明書のFQDN(サーバー名が一致しない)名に問題があります。
再生成しましたが、現在はそのようなエラーはありません。

モバイルAndroidクライアントからサーバー証明書を使用する必要があります。この問題に関する素晴らしい記事を見つけました- Androidで自己署名または未知のSSL証明書でRetrofitを使用します 。すべての手順を実行しましたが、残念ながらエラーが発生します(例外)。

javax.net.ssl.SSLPeerUnverifiedException: Hostname 195.xx.xx.xx not verified:
    certificate: sha1/qvH7lFeijE/ZXxNHI0B/M+AU/aA=
    DN: 1.2.840.113549.1.9.1=#160e63726f73704078616b65702e7275,CN=195.xx.xx.xx,OU=Departament of Development,O=CROSP Solutions,L=Chernihiv,ST=Chernihiv,C=UA
    subjectAltNames: []
            at com.squareup.okhttp.internal.http.SocketConnector.connectTls(SocketConnector.Java:124)

ご覧のとおり、ホスト名は同じですが、エラーがまだ存在しています。
この問題に対処するのを手伝ってください。どんな助けにも感謝します。
ありがとうございました。

擬似解決策

もちろん前に検索して、 HostName Verifier Solution を見つけました。
試してみましたが、動作します。しかし、この回避策を使用しても大丈夫ですか?前の例のように動的に読み取るためにアプリに証明書を追加しましたが、この場合もまだ使用されていますか?.

OkHttpを使用したソリューションは1行です。 (チュートリアルのすべての手順を実行した場合)。

 okHttpClient.setHostnameVerifier(new NullHostNameVerifier());

しかし、私はまだそれが最良の解決策ではないと感じています、ご意見をお聞かせください?

15
CROSP

興味深いことに、リクエストホストがIPの場合、「CN」はそれと一致するために使用されません。代わりに、

http://tools.ietf.org/html/rfc2818#section-3.1

iPAddress subjectAltNameは証明書に存在する必要があり、URIのIPと正確に一致する必要があります」

Javaのキーツールを使用する場合、次の方法で実行できます。

keytool -genkeypair  -ext SAN=IP:195.xx.xx.xx    ........

NullHostNameVerifierもユースケースに適しています。クライアントは1つの証明書のみを信頼しています。接続がその証明書を使用している限り、あなたは安全です。ホスト名はここでは関係ありません。

19
ZhongYu

自己署名証明書は、開発専用です。検証されていないことがわかっているため、ライブで使用することはできません。アプリとブラウザは、CAの承認なしでは信頼できません。

したがって、これはライブアプリの「解決策」ではなく、機能するかどうかをテストするためのものです(有効な証明書があれば、有効な証明書で機能します)。すべてのホスト名(または、少なくとも少数に制限する場合は、少なくともハードコードされたホスト名)を許可しているため、両方とも不適切です。

ライブアプリでも自己署名証明書を使用する必要がありますか?

2
Praba