2013-03-03 20 views
5

Tôi đang gặp khó khăn với Java SSL. Vấn đề là chìa khóa của tôi có mật khẩu. Khi tôi tạo khóa bằng cách sử dụng lệnh openssl req -new -newkey rsa:1024 -nodes -out local.csr -keyout local.key, khi được yêu cầu A challenge password []:, tôi đã nhập MyKeyPass. Sau đó, tôi đã nhận được chứng chỉ từ Tổ chức phát hành chứng chỉ. Sau đó, tôi đã nhập chứng chỉ vào một KeyStore và TrustStore.Làm cách nào để chỉ định mật khẩu khóa bằng javax.net.ssl?

Một trong các ứng dụng của tôi dựa trên Cầu tàu và chạy bằng Maven, ứng dụng kia sử dụng ổ cắm thô và tôi không sử dụng Maven cho nó.

Khi tôi sử dụng giấy chứng nhận với Jetty, sử dụng cấu hình sau đây, mọi thứ đều hoạt động tốt:

<connector implementation="org.mortbay.jetty.security.SslSelectChannelConnector"> 
    <port>443</port> 
    <maxIdleTime>30000</maxIdleTime> 
    <keystore>keys/domain.jks</keystore> 
    <password>KeyStorePass</password> 
    <keyPassword>MyKeyPass</keyPassword> 
    <truststore>keys/truststore_domain.jks</truststore> 
    <trustPassword>TrustStorePass</trustPassword> 
</connector> 

Tuy nhiên, đối với các ứng dụng không sử dụng Jetty/Maven, cấu hình sau không hoạt động:

-Djavax.net.ssl.keyStore=./keys/domain.jks \ 
-Djavax.net.ssl.keyStorePassword=KeyStorePass \ 
-Djavax.net.ssl.trustStore=./keys/truststore_domain.jks \ 
-Djavax.net.ssl.trustStorePassword=TrustStorePass \ 

tôi nhận được lỗi sau:

Caused by: java.security.UnrecoverableKeyException: Cannot recover key 
    at sun.security.provider.KeyProtector.recover(KeyProtector.java:328) 
    at sun.security.provider.JavaKeyStore.engineGetKey(JavaKeyStore.java:138) 
    at sun.security.provider.JavaKeyStore$JKS.engineGetKey(JavaKeyStore.java:55) 
    at java.security.KeyStore.getKey(KeyStore.java:792) 
    at sun.security.ssl.SunX509KeyManagerImpl.<init>(SunX509KeyManagerImpl.java:131) 
    at sun.security.ssl.KeyManagerFactoryImpl$SunX509.engineInit(KeyManagerFactoryImpl.java:68) 
    at javax.net.ssl.KeyManagerFactory.init(KeyManagerFactory.java:259) 
    at sun.security.ssl.SSLContextImpl$DefaultSSLContext.getDefaultKeyManager(SSLContextImpl.java:621) 
    at sun.security.ssl.SSLContextImpl$DefaultSSLContext.<init>(SSLContextImpl.java:486) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525) 
    at java.lang.Class.newInstance0(Class.java:372) 
    at java.lang.Class.newInstance(Class.java:325) 
    at java.security.Provider$Service.newInstance(Provider.java:1238) 
    ... 12 more 

Tất nhiên, nó là thiếu KeyPassword (MyKeyPass). Tôi đã cố gắng để tìm cách xác định nó bằng cách sử dụng cú pháp -Djavax.net.ssl, nhưng dường như không thể tìm thấy nó. Làm cách nào để chỉ định Mật khẩu khóa?

Trả lời

5

Bạn không thể làm điều đó thông qua các thuộc tính hệ thống đó: bạn phải sử dụng mặc định để nó giống như mật khẩu kho khóa. Hoặc người nào khác cài đặt KeyManager tùy chỉnh.

+0

Thay đổi 'KeyStorePass' thành' MyKeyPass' đã hoạt động. Cảm ơn. –

Các vấn đề liên quan