Для работы с SSL нам потребуется центр выдачи сертификатов. В тестовых целях можно воспользоваться openssl. Итак, подготавливаем необходимые сертификаты.
Небольшой скриптик (в PATH должны быть openssl и keytool)
| Цитата | #Генерируем rsa ключики для центра эмиссии сертификатов (ca), для сервера-tomcat (tomcat), для определенного клиента(client) openssl genrsa -out caPrivKey.pem 1024 openssl genrsa -out tomcatPrivKey.pem 1024 openssl genrsa -out clientPrivKey.pem 1024
#Создаем self-signed сертификат для центра эмиссии openssl req -new -x509 -key caPrivKey.pem -out caCert.crt
#Создаем запросы на сертификат для сервера и клиента openssl req -new -key tomcatPrivKey.pem -out tomcatReq.req openssl req -new -key clientPrivKey.pem -out clientReq.req
#Издаем сертификаты openssl x509 -req -in tomcatReq.req -CA caCert.crt -CAkey caPrivKey.pem -CAcreateserial -out tomcatCert.pem openssl x509 -req -in clientReq.req -CA caCert.crt -CAkey caPrivKey.pem -CAcreateserial -out clientCert.pem
#Конвертируем сертификат с ключом в pkcs12 формат openssl pkcs12 -export -in tomcatCert.pem -inkey tomcatPrivKey.pem -out tomcatCert.pfx openssl pkcs12 -export -in clientCert.pem -inkey clientPrivKey.pem -out clientCert.pfx
#Сконвертируем также сертификат центра эмиссии в JKS keytool -import -keystore .truststore -file caCert.crt
|
Примерный вывод:
| Цитата | Generating RSA private key, 1024 bit long modulus ...............................................++++++ ...................++++++ e is 65537 (0x10001) Generating RSA private key, 1024 bit long modulus ...................++++++ ................................++++++ e is 65537 (0x10001) Generating RSA private key, 1024 bit long modulus ..........................++++++ ..........++++++ e is 65537 (0x10001) You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [KZ]: State or Province Name (full name) [Kazakhstan]: Locality Name (eg, city) []: Organization Name (eg, company) [avHome]: Organizational Unit Name (eg, section) [tech]: Common Name (eg, YOUR name) []:ca Email Address []: You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [KZ]: State or Province Name (full name) [Kazakhstan]: Locality Name (eg, city) []: Organization Name (eg, company) [avHome]: Organizational Unit Name (eg, section) [tech]: Common Name (eg, YOUR name) []:Tomcat Serv Email Address []:
Please enter the following 'extra' attributes to be sent with your certificate request [Здесь просто жмем enter] A challenge password []: An optional company name []: You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [KZ]: State or Province Name (full name) [Kazakhstan]: Locality Name (eg, city) []: Organization Name (eg, company) [avHome]: Organizational Unit Name (eg, section) [tech]: Common Name (eg, YOUR name) []:Vasiylo Pupkin Email Address []:
Please enter the following 'extra' attributes to be sent with your certificate request [Здесь просто жмем enter] A challenge password []: An optional company name []: Signature ok subject=/C=KZ/ST=Kazakhstan/O=avHome/OU=tech/CN=Tomcat Serv Getting CA Private Key Signature ok subject=/C=KZ/ST=Kazakhstan/O=avHome/OU=tech/CN=Vasiylo Pupkin Getting CA Private Key [пароль для ключика tomcat] Enter Export Password: Verifying - Enter Export Password: [пароль для ключика клиента] Enter Export Password: Verifying - Enter Export Password: [пароль для хранилища доверенных сертификатов] Enter keystore password: 123456 Owner: CN=ca, OU=tech, O=avHome, ST=Kazakhstan, C=KZ Issuer: CN=ca, OU=tech, O=avHome, ST=Kazakhstan, C=KZ Serial number: e7300e152194dc61 Valid from: Sun Oct 14 00:50:07 ALMT 2007 until: Tue Nov 13 00:50:07 ALMT 2007 Certificate fingerprints: MD5: E9:0E:2C:66:7E:48:44:4D:D9:23:1F:14:5A:0F:5A:6D SHA1: 03:63:DD:E0:3C:87:9B:63:54:76:52:E4:46:7D:4C:AF:AC:36:3F:05 Trust this certificate? [no]: yes Certificate was added to keystore
|
Все необходимые сертификаты и ключи подготовлены, приступаем к настройке клиента и сервера.
Настройка клиента заключается в добавлении сертификата центра эмиссии, как доверенного сертификата. И непосредственно пользовательского сертификата с ключом. Добавление сертификатов рассмотрю на примере Mozilla FireFox, работа с сертификатами в других браузерах не должна сильно отличаться. Итак, Main menu\Edit\Preferences\Advanced\Encryption\View Certificates. Нас интересуют вкладки Authorities (для доверенных сертификатов) и Your Certificates (для вашего сертификата с ключом). Собственно переходим на вкладки Authorities, жмем кнопку Import, выбираем наш файл caCert.crt. Появится окно, в котором необходимо указать, что сертификат будет использоваться для идентификации web серверов. Все OK, сертификат должен появиться, среди других доверенных сертификатов. Теперь добавим пользовательский сертификат. Переходим на вкладку Your Certificates, import. Если это первый сертификат в вашем хранилище, вас попросят ввести пароль для доступа к хранилищу личных сертификатов, если не первый, то, соответственно спросят этот пароль. Далее попросят ввести пароль, на котором зашифрован ключик, который мы импортируем, вводим. Далее должно последовать появление сообщения об успешном добавлении сертификата, и сертификат должен появиться в списке.
Настройка сервера tomcat заключается в добавлении SSL коннектора, его настройки, добавление хранилища доверенных сертификатов, и добавления хранилища сертификата с ключом сервера. Создаем папку $CATALINA_HOME/ssl, в которую копируем наши файлы tomcatCert.pfx и .truststore. Правим конфигурационный файл conf/server.xml: Раскоменчиваем SSL коннектор добавляем туда параметры для указания хранилищ сертификатов, должно получиться что-то вроде этого.
| Код | <Connector port="8443" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" disableUploadTimeout="true" acceptCount="100" scheme="https" secure="true" clientAuth="true" sslProtocol="TLS" keystoreFile="ssl/tomcatCert.pfx" keystorePass="123456" keystoreType="pkcs12" truststoreFile="ssl/.truststore" truststorePass="123456" truststoreType="JKS" />
|
Следуем обратить внимание на последние две строки и на clientAuth="true".
Запускаем сервер. Пробуем подключиться на 8443 порт. https://servername:8443. Если спросит сертификат, значит, все идет нормально, выбираем наш сертификат и мы на нужной странице.
Теперь займемся серверными приложениями. Создаем простой сервлет, в обработчик добавляем следующий код
| Код | out.println("<b> Attribute names</b><br>"); Enumeration attrs = request.getAttributeNames(); while (attrs.hasMoreElements()) { out.println((String)attrs.nextElement() + "<br>"); } out.println("<b>Certificate:</b>"); X509Certificate cert[]; cert = (X509Certificate[])request.getAttribute("javax.servlet.request.X509Certificate"); out.println(cert); out.println(cert[0]);
|
В итоге, у нас есть объект типа java.security.cert.X509Certificate, представляющий пользовательский сертификат. Кроме атрибута javax.servlet.request.X509Certificate, сервер добавляет еще несколько, можно глянуть их, может пригодятся. Собственно все. |