Sonunda tüm sorunları çözmeyi başardım, bu yüzden kendi sorumu cevaplayacağım. Bunlar, özel sorun (lar) ımı çözmek için kullandığım ayarlar / dosyalar;
Müşterinin deposu bir olduğunu PKCS # 12 biçiminde içeren dosya
- İstemcinin genel sertifikası (bu durumda kendinden imzalı bir CA tarafından imzalanmış)
- Müşterinin özel anahtarı
Bunu oluşturmak için OpenSSL pkcs12
komutunu kullandım, örneğin;
openssl pkcs12 -export -in client.crt -inkey client.key -out client.p12 -name "Whatever"
İpucu: PKCS # 12 dosyalarını düzgün bir şekilde oluşturmanıza izin vermeyen bir hatadan muzdarip olduğu için 0.9.8h sürümünü değil , en son OpenSSL'yi aldığınızdan emin olun .
Bu PKCS # 12 dosyası, sunucu istemciden açıkça kimlik doğrulaması istediğinde istemci sertifikasını sunucuya sunmak için Java istemcisi tarafından kullanılacaktır. İstemci sertifikası kimlik doğrulaması protokolünün gerçekte nasıl çalıştığına genel bir bakış için TLS hakkındaki Wikipedia makalesine bakın (ayrıca burada istemcinin özel anahtarına neden ihtiyacımız olduğunu açıklar).
Müşterinin truststore bir yalındır JKS biçimi içeren dosya kök veya ara CA sertifikalarını . Bu CA sertifikaları, hangi uç noktalarla iletişim kurmanıza izin verileceğini belirler, bu durumda, müşterinizin güven veren mağazanın CA'larından biri tarafından imzalanmış bir sertifikayı sunan herhangi bir sunucuya bağlanmasına izin verir.
Bunu oluşturmak için standart Java tuş takımını kullanabilirsiniz;
keytool -genkey -dname "cn=CLIENT" -alias truststorekey -keyalg RSA -keystore ./client-truststore.jks -keypass whatever -storepass whatever
keytool -import -keystore ./client-truststore.jks -file myca.crt -alias myca
Bu güvenilir mağazayı kullanarak, müşteriniz tarafından belirlenen CA tarafından imzalanmış bir sertifika sunan tüm sunucularla tam bir SSL anlaşması yapmaya çalışacaktır myca.crt
.
Yukarıdaki dosyalar kesinlikle sadece müşteri içindir. Bir sunucu kurmak istediğinizde, sunucunun kendi anahtar ve güven deposu dosyalarına ihtiyacı vardır. Bir Java istemcisi ve sunucusu (Tomcat kullanarak) için tam olarak çalışan bir örnek oluşturmak için harika bir gezinti bu web sitesinde bulunabilir .
Sorunlar / Açıklamalar / İpuçları
- İstemci sertifikası kimlik doğrulaması yalnızca sunucu tarafından uygulanabilir.
- ( Önemli! ) Sunucu bir istemci sertifikası istediğinde (TLS anlaşmasının bir parçası olarak), sertifika isteğinin bir parçası olarak güvenilir CA'ların bir listesini de sağlar. Kimlik doğrulama için bugüne isteyen istemci sertifikası zaman değil bu CA adlı biri tarafından imzalanmış, (bence, bu garip bir davranıştır, ama emin bunun için bir sebebi var olduğum) Tüm sunulacak olmayacaktır. Karşı tarafın sunucusunu kendinden imzalı istemci sertifikamı kabul edecek şekilde yapılandırmamış olması nedeniyle, sorunumun ana nedeni buydu ve istemcinin istekte düzgün bir şekilde sertifika vermemesi nedeniyle sorunun benim tarafımda olduğunu varsaydık.
- Wireshark'ı edinin. Mükemmel SSL / HTTPS paket analizine sahiptir ve hata ayıklama ve sorunu bulma konusunda büyük bir yardımcı olacaktır. Bu benzeyen
-Djavax.net.debug=ssl
ama daha yapılandırılmıştır ve (belki) Java SSL ayıklama çıkışı memnun değilsen yorumlamak daha kolay.
Apache httpclient kütüphanesini kullanmak mükemmel bir şekilde mümkündür. Httpclient kullanmak istiyorsanız, hedef URL'yi HTTPS eşdeğeriyle değiştirin ve aşağıdaki JVM bağımsız değişkenlerini ekleyin (HTTP / HTTPS üzerinden veri göndermek / almak için kullanmak istediğiniz kitaplığa bakılmaksızın diğer tüm istemciler için aynıdır) :
-Djavax.net.debug=ssl
-Djavax.net.ssl.keyStoreType=pkcs12
-Djavax.net.ssl.keyStore=client.p12
-Djavax.net.ssl.keyStorePassword=whatever
-Djavax.net.ssl.trustStoreType=jks
-Djavax.net.ssl.trustStore=client-truststore.jks
-Djavax.net.ssl.trustStorePassword=whatever