Я пытаюсь настроить веб-службу Java, работающую в Tomcat 7, для использования взаимной (двухсторонней) аутентификации. Кажется, что независимо от того, что я делаю, подключение к службе на защищенном порту не работает.
Вот что я сделал для создания сертификатов и хранилищ ключей и т.д.
//create the key and certificate for the tomcat server.
keytool -genkey -v -alias tomcat -keyalg RSA -validity 3650 -keystore tomcat.keystore
//create the key and certificate for the client machine.
keytool -genkey -v -alias clientkey -keyalg RSA -storetype PKCS12 -keystore client.p12
//export the client key
keytool -export -alias clientkey -keystore client.p12 -storetype PKCS12 -rfc -file client.cer
//import the client key into the server keystore
keytool -import -v -file client.cer -keystore tomcat.keystore
Здесь соединитель в файле server.xml:
<Connector port="8443"
maxThreads="150"
scheme="https"
secure="true"
sslProtocol="TLS"
clientAuth="true"
keystoreFile="tomcat.keystore"
keystorePass="tomcat"
truststoreFile="tomcat.keystore"
truststorePass="tomcat"/>
Файл tomcat-users.xml выглядит следующим образом:
<tomcat-users>
<role rolename="tomcat"/>
<role rolename="admin"/>
<!-- note that the actual values for CN, OU, O, L, ST are different, but they match the values created in the client certificate -->
<user username="CN=name, OU=unit, O=org, L=locality, ST=state, C=US" password="null" roles="admin" />
</tomcat-users>
При запуске устанавливаются следующие параметры:
-Djavax.net.ssl.keyStoreType=jks
-Djavax.net.ssl.keyStore=tomcat.keystore
-Djavax.net.ssl.keyStorePassword=tomcat
-Djavax.net.ssl.trustStore=tomcat.keystore
-Djavax.net.ssl.trustStorePassword=tomcat
-Djavax.net.debug=SSL
Наконец, я скопировал файл client.p12 на свой клиентский компьютер и импортировал его в сертификаты клиента Firefox.
Первая проблема: Когда я ударил конечную точку на моем сервисе (пример - https://my.server.com:8443/test) из Firefox, я получил ответ "Безопасное соединение сбой". SSL получил запись, которая превысила максимально допустимую длину. (Код ошибки: ssl_error_rx_record_too_long)
Вторая проблема: Я действительно не хочу запускать этот разъем на порту 8443. Я хочу запустить его на порте 7800 (который является нашим стандартом для HTTPS). Когда я меняю порт на соединителе на 7800 и пытаюсь попасть в конечную точку (пример - https://my.server.com:7800/test), он никогда не разрешает страницу.
Итак, где-то я, очевидно, не вижу ключевой части. Может ли кто-нибудь увидеть мою ошибку?
UPDATE: после обратной связи от @Dave G
Запуск команды:
openssl s_client -connect localhost:8443 -showcerts
выводит следующий результат:
CONNECTED(00000003)
140642290976584:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:s23_clnt.c:766:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 263 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
---
Я также добавил -Djavax.net.debug = SSL для запуска. Это создает в начале файла catalina.out следующее:
trustStore is: tomcat.keystore
trustStore type is : jks
trustStore provider is :
init truststore
adding as trusted cert:
Subject: CN=localhost, OU=unit, O=org, L=Springfield, ST=MO, C=US
Issuer: CN=localhost, OU=unit, O=org, L=Springfield, ST=MO, C=US
Algorithm: RSA; Serial number: 0x5485b5a5
Valid from Mon Dec 08 14:28:53 UTC 2014 until Thu Dec 05 14:28:53 UTC 2024
adding as trusted cert:
Subject: CN=William Jackson, OU=unit, O=org, L=Springfield, ST=MO, C=US
Issuer: CN=William Jackson, OU=unit, O=org, L=Springfield, ST=MO, C=US
Algorithm: RSA; Serial number: 0x5485b6af
Valid from Mon Dec 08 14:33:19 UTC 2014 until Sun Mar 08 14:33:19 UTC 2015
trigger seeding of SecureRandom
done seeding SecureRandom
И затем LOT of:
Ignoring unavailable cipher suite: <suite name>
Ignoring unsupported cipher suite: <suite name>