JetThoughts

OpenSSL with Nginx and untrusted CA

October 23rd 2009

Поставили на работе задачу установить ssl сертификат для работы веб приложения. Веб сервер был nginx, а провайдера бесплатного нашли http://www.instantssl.com/ *COMODO*.

Сотрудник, Саша Локшин помог в этом вопросе и выдал алгоритм создания ключика и его подписывание провайдером. И дал документацию простейшую http://www.rapidssl.com/resources/csr/apache_mod_ssl.htm. И в прям весь процесс генерации прошел быстро, поля так же заполнил по предложеному формату. Не вводил секретных фраз и не заполнял extraатрибутов:

# openssl genrsa -out domain.com.key
Generating RSA private key, 2048 bit long modulus

# openssl req -new -key domain.com.key -out domain.com.csr
....

Получилось два файла. Теперь время регистрации у провайдера. Там все просто так же. Нам нужно скопировать контент файла domain.com.csr и запостить его в поле.

# cat domain.com.csr

После, сервис выслал письмо активации админу домена на мыло admin@domain.com, и после активации сертификата он выслал мне на почту архив с описанием:

    
    * Root CA Certificate - AddTrustExternalCARoot.crt
    * Intermediate CA Certificate - UTNAddTrustSGCCA.crt
    * Intermediate CA Certificate - ComodoUTNSGCCA.crt
    * Intermediate CA Certificate - EssentialSSLCA_2.crt
    * Your Free SSL Certificate - domain_com.crt

Вот я думал и все приключения. Соотвественно манюалу nginx создал конфиг для приложения.

ssl    on;
ssl_certificate    /etc/ssl/private/domain_com.crt; (or .pem)
ssl_certificate_key    /etc/ssl/private/domain.com.key;

Все отлично. Запустилось, но вот дела, захожу на страницу и выдает ошибка, что не известный сертификат. Часик танца с бубном нашел статью http://terra-firma-design.com/blog/20-Installing-an-EV-SSL-Certificate-on-Nginx. Где они объясняют метод передачи нескольких сертификатов в один для nginx. В apache такого не нужно, ему можно задать каталог этих сертификатов.

# cat  AddTrustExternalCARoot.crt EssentialSSLCA_2.crt ComodoUTNSGCCA.crt UTNAddTrustSGCCA.crt domain_com.crt >> domain_com_new.crt

И подправил соотвественно конфиг nginx. Затем перезапускаю сервер и вуаля вылетает ошибка.

Restarting nginx: [emerg]: invalid number of arguments in "ssl_certificate" directive in /opt/nginx/conf/production.conf:54

Вот думаю отлично. Потом нашел форум, где обсуждали подубную ситуацию. И парень предложил проверить ключ и полученный сертификат. Сказал что поля Modulus тоже совпадать

# openssl x509 -noout -text -in domain_com.crs
................
            RSA Public Key: (1024 bit)
                Modulus (1024 bit):
                    00:bb:e1:e7:7a:63:b8:eb:14:e4:44:93:11:1e:25:
                    e4:52:07:5c:d1:33:5d:e2:84:88:4c:24:3a:bb:61:
                    32:35:fe:51:02:73:fb:2e:09:86:9c:54:3f:dc:e0:
                    11:d1:b7:4c:4f:a8:f9:fa:ab:e4:a7:a1:22:f5:43:
                    b3:b6:a9:f4:84:4a:89:33:63:d3:3b:e5:9f:11:65:
                    31:0a:84:0b:6e:b3:62:75:42:40:ac:17:cc:3e:9b:
                    eb:46:04:25:3a:43:be:3c:73:57:04:8b:f0:f2:45:
                    ad:4c:5c:f5:38:fb:66:bc:7f:b0:30:5e:ab:7d:73:
                    af:1d:2c:a6:0f:01:5d:25:d9
................
# openssl x509 -noout -text -in /opt/nginx/cert/domain_com.crt
..............
            RSA Public Key: (2048 bit)
                Modulus (2048 bit):
                    00:b7:89:02:04:4e:4c:9b:cd:29:be:e9:3e:fa:74:
                    44:6b:8e:bd:58:91:68:82:cb:3c:06:c9:2a:fe:19:
                    95:b1:21:29:a0:94:94:5b:58:30:bb:bd:5b:d5:ca:
                    79:4c:c2:d0:65:1e:d8:e8:2e:91:c6:5d:c0:55:49:
                    d1:9d:a7:ec:38:d9:be:db:21:1a:59:b3:56:d7:6f:
                    94:18:ec:65:38:35:82:9d:c5:80:f5:48:07:77:fc:
                    07:4f:50:8e:df:a3:bf:07:49:2b:9a:91:be:c8:a5:
                    b4:9e:1e:aa:b1:6d:c8:aa:ea:64:a3:da:13:27:7d:
                    80:92:0e:41:de:3a:54:95:d4:75:24:2a:17:35:27:
                    e2:00:10:d2:c0:22:24:e9:32:84:49:d4:eb:ba:f0:
                    e3:de:ee:0d:90:e6:23:62:aa:51:6c:57:3f:46:00:
                    5d:3c:35:64:24:f5:ab:ea:f7:21:22:91:46:48:e5:
                    af:35:ea:03:bd:3b:fb:80:d7:38:cd:46:16:9a:34:
                    ee:f4:96:24:2c:37:dc:27:87:3f:c2:b9:f9:d0:66:
                    eb:90:c9:19:6b:87:c3:f7:f1:d0:c2:c6:68:a8:5a:
                    71:e7:b8:79:6b:d0:c6:cd:88:0c:cf:d5:c4:67:0f:
                    da:47:ad:6e:c1:72:5e:f2:30:64:2f:14:7c:4d:d5:
                    5c:5d
            ......

Увидел тот факт что они разные. И что провайдер мне подписал ключ 2048 битным шифром. А у меня по умолчанию 1024. Я решил переделать ключ, но только 2048 бит установить.

# openssl genrsa -out domain_com.key 2048
# openssl req -new -key domain_com.key -out domain_com.csr

За полчаса добазарился с провайдером о замене csr файла и о выдаче нового сертификата. Попробывал опять чистый сертификат и мои ключ. Не получилось. Тогда я объединил все сертификаты в один методом:

# cat  AddTrustExternalCARoot.crt EssentialSSLCA_2.crt ComodoUTNSGCCA.crt UTNAddTrustSGCCA.crt domain_com.crt >> domain_com_new.crt

При загрузки веб сервера вылетает ошибка такая же как и в прошлый раз. Тогда решил проверить инфу такого сертификата:

# openssl x509 -noout -text -in ssl-bundle.crt -modulus

Он выдал всего лишь первый сертификат из списка. Тогда я решил немного поменять методы склейки сертфикатов, и сделать так что сертификат моего домена был выше и проверить инфу:

# cat domain_com.crt AddTrustExternalCARoot.crt EssentialSSLCA_2.crt ComodoUTNSGCCA.crt UTNAddTrustSGCCA.crt > domain_com_2.crt
# openssl x509 -noout -text -in ssl-bundle.crt -modulus

Как и ожидалось, он выдал инфу только по нужном сертификате. Перегружаем веб сервер и вуаля он запустился. Заходим на страничку и он видит нормально сертификат без всяких ошибок и окошек.

blog comments powered by Disqus

Powered by Rackspace Cloud Computing