вот понадобилось сделать линк с IBM MQ через SSL, без SSL все работает
замечательно, но безопасникам не нравится. Ладно. Сгенерили безопасники
сертификат, сконвертил все это в JKS.
Задал параметры:
System.setProperty("javax.net.ssl.trustStore", sslkeyr );
System.setProperty("javax.net.ssl.trustStorePassword", sslpass );
System.setProperty("javax.net.ssl.keyStore", sslkeyr );
System.setProperty("javax.net.ssl.keyStorePassword", sslpass );
Указал в параметрах коннекшена к MQ что нужен SSL - но не коннектитися с
традиционно информативным сообщением "Error accessing socket streams". :)
Запустил то же самое под IBM JRE - работает. Сравнил чем отличаются
java.security и добавил в Sun JRE
security.provider.10=com.ibm.jsse.IBMJSSEProvider
security.provider.11=com.ibm.crypto.provider.IBMJCE
security.provider.12=com.ibm.security.jgss.IBMJGSSProvider
security.provider.13=com.ibm.security.cert.IBMCertPath
Добавил IBM-овские jar-ы с этими классами в CLASSPATH - но эффекта нет.
Взял из примеров по SSL простенькие клиент и сервер обменивающиеся сообщениями
по SSL. То же самое: с этими ключами под IBM JRE работает, а под Sun JRE нет.
Hо хоть сообщений побольше пишет:
keyStore is : key.jks
keyStore type is : jks
keyStore provider is :
init keystore
init keymanager of type SunX509
default context init failed: java.security.UnrecoverableKeyException: excess
private key
Try to create socket.
java.net.SocketException: java.security.NoSuchAlgorithmException: Error
constructing implementation (algorithm: Default,
provider: SunJSSE, class: com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl)
at javax.net.ssl.DefaultSSLServerSocketFactory.throwException(Unknown
Source)
at
javax.net.ssl.DefaultSSLServerSocketFactory.createServerSocket(Unknown Source)
at EchoServer.main(EchoServer.java:34)
Caused by: java.security.NoSuchAlgorithmException: Error constructing
implementation (algorithm: Default, provider: SunJ
SSE, class: com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl)
at java.security.Provider$Service.newInstance(Unknown Source)
at sun.security.jca.GetInstance.getInstance(Unknown Source)
at sun.security.jca.GetInstance.getInstance(Unknown Source)
at javax.net.ssl.SSLContext.getInstance(Unknown Source)
at javax.net.ssl.SSLContext.getDefault(Unknown Source)
at javax.net.ssl.SSLServerSocketFactory.getDefault(Unknown Source)
at EchoServer.main(EchoServer.java:21)
Caused by: java.security.UnrecoverableKeyException: excess private key
at sun.security.provider.KeyProtector.recover(Unknown Source)
at sun.security.provider.JavaKeyStore.engineGetKey(Unknown Source)
at sun.security.provider.JavaKeyStore$JKS.engineGetKey(Unknown Source)
at java.security.KeyStore.getKey(Unknown Source)
at com.sun.net.ssl.internal.ssl.SunX509KeyManagerImpl.<init>(Unknown
Source)
at
com.sun.net.ssl.internal.ssl.KeyManagerFactoryImpl$SunX509.engineInit(Unknown
Source)
at javax.net.ssl.KeyManagerFactory.init(Unknown Source)
at
com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl.getDefaultKeyManager(Unknown
Source)
at com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl.<init>(Unknown
Source)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native
Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown
Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown
Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at java.lang.Class.newInstance0(Unknown Source)
at java.lang.Class.newInstance(Unknown Source)
... 7 more
Hасколько я понимаю, он упорно пытается использовать провайдер SunJSSE.
Hо что не нравится этому провайдеру и как заюзать другой - не понятно.
Алексей