SSL certificates issue

Driantsov Alexander bender at x-cart.com
Mon Nov 19 14:48:27 MSK 2007


Добрый день.

Столкнулся с проблемой при нескольких vhost'ах и SSL. Possibly a bug.

Описание:

Nginx используется как reverse-proxy для HTTPS. Есть 2(3,5,10) виртуальных хостов. Для них есть wildcard ssl cert. В первод домене(скажем subdomain1.domain.com) подсоединяется wildcard ssl cert, но в subdomain2.domain.com необходимо подключить сертификат конкретно для определенного домена, т.к. этот домен, отзывается как на subdomain2.domain.com, так и на domain2.com. По какой-то причине Nginx использует один и тот же сертификат для обоих виртуальных хостов(тот что был подключен первым)

Конфигурация nginx:

# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/0.5.33
built by gcc 4.1.1 20070105 (Red Hat 4.1.1-52)
configure arguments: --with-zlib=../zlib-1.2.3 --prefix=/usr/local/nginx --with-http_ssl_module

Конфиги:

/usr/local/nginx/conf/nginx.conf:
--------------------------------------
user root;
worker_processes  6;

pid        logs/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       conf/mime.types;
    default_type  application/octet-stream;

include conf/http.conf;
include conf/vhosts.conf;
}
--------------------------------------
conf/http.conf:
--------------------------------------
    sendfile        on;
    gzip  on;
    gzip_min_length  1100;
    gzip_buffers     4 8k;
    gzip_types       text/plain;
    output_buffers   1 100k;
    postpone_output  10460;

    tcp_nopush       on;
    tcp_nodelay      on;

    keepalive_timeout  2250 120;
    client_header_timeout  3m;
    client_body_timeout    3m;
    send_timeout           3m;
    proxy_read_timeout 300;
    proxy_connect_timeout 300;
    proxy_send_timeout 300;
    client_header_buffer_size    1k;
    client_max_body_size 150M;
    large_client_header_buffers  4 4k;
    server_names_hash_bucket_size 64;
--------------------------------------
conf/vhosts.conf:
--------------------------------------
include vhosts/subdomain1.domain.com.conf;
include vhosts/subdomain2.domain.com.conf;
--------------------------------------

В subdomain1.domain.com.conf'е задается SSL сертификат:
--------------------------------------
server {
 listen 443;
 server_name subdomain1.domain.com www.subdomain1.domain.com;

 ssl on;
 ssl_certificate certs/wildcard.crt;
 ssl_certificate_key certs/wildcard.key;
 ssl_session_timeout 5m;

 ssl_protocols SSLv2 SSLv3 TLSv1;
 ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
 ssl_prefer_server_ciphers on;

 location / {
  proxy_pass http://subdomain1.domain.com/ ;
  proxy_set_header  X-Real-IP  $remote_addr;
 }

 location ~* ^.+\.(jpg|jpeg|gif|css|js)$ {
 root /var/www/vhosts/sith-killer.x-shops.com/httpdocs;
 access_log off;
 expires 30d;
 }
}
--------------------------------------
vhosts/subdomain2.domain.com.conf:
--------------------------------------
server {
 listen 443;
 server_name subdomain2.domain.com www.subdomain2.domain.com domain2.com www.domain2.com;

 ssl on;
 ssl_certificate certs/domain2.com.crt;
 ssl_certificate_key certs/domain2.com.key;
 ssl_client_certificate certs/domain2.com.ca;
 ssl_session_timeout 5m;

 ssl_protocols SSLv2 SSLv3 TLSv1;
 ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
 ssl_prefer_server_ciphers on;

 location / {
  proxy_pass http://domain2.com/ ;
  proxy_redirect off;
  proxy_set_header Host $host;
  proxy_set_header SSL YES;
  proxy_set_header X-Real-IP  $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  client_max_body_size 10m;
  client_body_buffer_size 128k;
  proxy_connect_timeout 90;
  proxy_send_timeout 90;
  proxy_read_timeout 90;
  proxy_buffer_size 4k;
  proxy_buffers 4 32k;
  proxy_busy_buffers_size 64k;
  proxy_temp_file_write_size 64k;
 }

 location ~* ^.+\.(jpg|jpeg|gif|css|js)$ {
 root /var/www/vhosts/domain2.com/httpdocs;
 access_log off;
 expires 30d;
 }
}
--------------------------------------

Такое ощущение, что Nginx считывает переменную ssl_certificate только один раз, а все последующие разы игнорирует. Хотя в таком случае он должен был сказать что директива задана дважды.

P.S: не обращайте внимание на:

proxy_set_header SSL YES;

сделано для того, чтобы в дальнейшем в Апаче определить то, что пользователь пришел с HTTPS через .htaccess, не прибегая к модификации кода. Всмысле вот так:

       RewriteEngine on
       RewriteCond %{HTTP:SSL} YES
       RewriteRule .* - [E=HTTPS:on,L]

Всем спасибо.

-- 
Sincerely yours,
Driantsov Alexander,
Technical Support Engineer
 
Qualiteam Software
Glavpochtamt, p/o box 5152.   [web site] http://www.x-cart.com/
432072 Ulyanovsk, Russia      [ phone  ] +7-(8422)-429037  (9:00-18:00 GMT +4)






More information about the nginx-ru mailing list