Проблема при настройке SSL-сертификатов для виртуальных хостов с использованием Apache \ Phusion Passenger на локальном хосте - PullRequest
2 голосов
/ 28 февраля 2011

Я использую Ruby on Rails 3, и я хотел бы заставить работать HTTPS-соединения на localhost .

Я использую:

  • Apache v2 + Phusion Passenger
  • Mac OS + Snow Leopard v10.6.6

В моей установке Ruby on Rails используется Typhoeus gem (можно использовать библиотеку Ruby net \ http, но результат не меняется) для выполнения HTTP-запросов через HTTPS.

Я создал самозаверяющие ca.key , pjtname.crt и pjtname.key как , подробно описано на веб-сайте Apple .

Уведомление : Следуя инструкциям на веб-сайте Apple, при запуске команды openssl req -new -key server.key -out server.csr (см. Ссылку) на данном этапе

Common Name (eg, YOUR name) []: (this is the important one)

Я ввел *pjtname.com, так что это действительно для всех поддоменов этого сайта.


В моем Apache httpd.conf у меня настроены два виртуальных хоста:

# Secure (SSL/TLS) connections
#Include /private/etc/apache2/extra/httpd-ssl.conf
#
# Note: The following must must be present to support
#       starting without SSL on platforms with no /dev/random equivalent
#       but a statically compiled-in mod_ssl.
#
<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>

Include /private/etc/apache2/other/*.conf



# Passenger configuration
   LoadModule passenger_module /Users/<my_user_name>/.rvm/gems/ruby-1.9.2-p136/gems/passenger-3.0.2/ext/apache2/mod_passenger.so
   PassengerRoot /Users/<my_user_name>/.rvm/gems/ruby-1.9.2-p136/gems/passenger-3.0.2
   PassengerRuby /Users/<my_user_name>/.rvm/wrappers/ruby-1.9.2-p136/ruby




# Go ahead and accept connections for these vhosts
# from non-SNI clients
SSLStrictSNIVHostCheck off


# Ensure that Apache listens on port 443
Listen 443

# Listen for virtual host requests on all IP addresses
NameVirtualHost *:80
NameVirtualHost *:443



#
# PJTNAME.COM and subdomains SETTING
#



<VirtualHost *:443>
  # Because this virtual host is defined first, it will
  # be used as the default if the hostname is not received
  # in the SSL handshake, e.g. if the browser doesn't support
  # SNI.

  ServerName pjtname.com:443
  DocumentRoot "/Users/<my_user_name>/Sites/pjtname.com/pjtname.com/public"

  ServerAdmin you@example.com
  ErrorLog "/private/var/log/apache2/error_log"
  TransferLog "/private/var/log/apache2/access_log"

  RackEnv development

  <Directory "/Users/<my_user_name>/Sites/pjtname.com/pjtname.com/public">
    Order allow,deny
    Allow from all
  </Directory>

  # SSL Configuration
  SSLEngine on

  # Self Signed certificates
  # Server Certificate
  SSLCertificateFile /private/etc/apache2/ssl/wildcard.certificate/pjtname.crt
  # Server Private Key
  SSLCertificateKeyFile /private/etc/apache2/ssl/wildcard.certificate/pjtname.key
  # Server Intermediate Bundle
  SSLCertificateChainFile /private/etc/apache2/ssl/wildcard.certificate/ca.crt
</VirtualHost>

# HTTP Setting
<VirtualHost *:80>
  ServerName pjtname.com
  DocumentRoot "/Users/<my_user_name>/Sites/pjtname.com/pjtname.com/public"

  RackEnv development

  <Directory "/Users/<my_user_name>/Sites/pjtname.com/pjtname.com/public">
    Order allow,deny
    Allow from all
  </Directory>
</VirtualHost>




<VirtualHost *:443>
  ServerName users.pjtname.com:443
  DocumentRoot "/Users/<my_user_name>/Sites/pjtname.com/users.pjtname.com/public"

  ServerAdmin you@example.com
  ErrorLog "/private/var/log/apache2/error_log"
  TransferLog "/private/var/log/apache2/access_log"

  RackEnv development

  <Directory "/Users/<my_user_name>/Sites/pjtname.com/users.pjtname.com/public">
    Order allow,deny
    Allow from all
  </Directory>

  # SSL Configuration
  SSLEngine on

  # Self Signed certificates
  # Server Certificate
  SSLCertificateFile /private/etc/apache2/ssl/wildcard.certificate/pjtname.crt
  # Server Private Key
  SSLCertificateKeyFile /private/etc/apache2/ssl/wildcard.certificate/pjtname.key
  # Server Intermediate Bundle
  SSLCertificateChainFile /private/etc/apache2/ssl/wildcard.certificate/ca.crt
</VirtualHost>

# HTTP Setting
<VirtualHost *:80>
  ServerName users.pjtname.com
  DocumentRoot "/Users/<my_user_name>/Sites/pjtname.com/users.pjtname.com/public"

  RackEnv development

  <Directory "/Users/<my_user_name>/Sites/pjtname.com/users.pjtname.com/public">
    Order allow,deny
    Allow from all
  </Directory>
</VirtualHost>

В файле host у меня есть:

##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
127.0.0.1   localhost
255.255.255.255 broadcasthost
::1             localhost 
fe80::1%lo0 localhost

# PJTNAME.COM SETTING

127.0.0.1 pjtname.com
127.0.0.1 users.pjtname.com

Кажется, все работает правильно, потому что я уже все установил (думаю, правильно):

  • Я сгенерировал подстановочный сертификат для своих доменов и поддоменов (в этом примере: * .pjtname.com)
  • Я установил виртуальные хосты с базовым именем в файле http.conf, прослушивающем порты :433 и :80
  • Мой браузер также принимает сертификаты, если он предупреждает меня, что они небезопасны ( уведомление : я должен принимать сертификаты для каждого домена \ субдомена; то есть [только] в первый раз, когда я получить доступ к домену или субдомену по HTTPS, я должен выполнить ту же процедуру для принятия), и я могу иметь доступ к страницам, используя HTTPS

После всей этой работы, когда я делаю запрос, используя Typhoeus (я могу также использовать библиотеку Ruby Net :: Http, и результат не меняется) из приложения pjtname.com RoR:

# Typhoeus request
Typhoeus::Request.get("https://users.pjtname.com/")

Я получаю что-то вроде предупреждения о сертификате:

--- &id001 !ruby/object:Typhoeus::Response 
app_connect_time: 0.0
body: ""
code: 0
connect_time: 0.000625

# Here is the warning
curl_error_message: Peer certificate cannot be authenticated with known CA certificates

curl_return_code: 60
effective_url: https://users.pjtname.com/
headers: ""
http_version: 
mock: false
name_lookup_time: 0.000513
pretransfer_time: 0.0
request: !ruby/object:Typhoeus::Request 
  after_complete: 
  auth_method: 
  body: 
  ...

Все это означает, что что-то не так. Итак, что я должен сделать, чтобы избежать предупреждения «Невозможно подтвердить подлинность сертификата однорангового узла с помощью известных сертификатов CA» и заставить запрос HTTPS работать? Где \ ошибки \ ошибки (думаю, в конфигурации Apache, но где?!) ?

P.S .: если вам нужна дополнительная информация, дайте мне знать.

1 Ответ

4 голосов
/ 28 февраля 2011

Я думаю, что ваша конфигурация Apache в порядке, просто поскольку вы используете самозаверяющий сертификат, вам необходимо указать на стороне клиента, что вы доверяете сертифицирующему органу.

Похоже, что Typhoeus использует curl, который имеет свое собственное хранилище сертификатов, независимо от брелка OS X (который будет использоваться вашим браузером)

На моем ящике он находится по адресу /opt/local/share/curl/curl-ca-bundle.crt и представляет собой просто объединенный список удостоверяющих органов. Чтобы избавиться от предупреждения, вы должны иметь возможность добавить созданный ЦС в конец этого файла:

cat /path/to/ca.crt >> /path/to/curl-ca-bundle.crt

(или вы можете отредактировать его вручную, чтобы добавить комментарий о том, что это за сертификат)

Однако при следующем обновлении curl вы вполне можете потерять эти изменения, поэтому может быть лучше, чтобы curl просто не проверял сертификат партнера. (может быть хорошо иметь разные настройки prod / dev для этого в вашем приложении). Я никогда не использовал Typhoeus, но, похоже, вы можете указать следующее:

:disable_ssl_peer_verification => true

при совершении звонков:

Typhoeus::Request.get("https://mail.google.com/mail", :disable_ssl_peer_verification => true). 

У Curl есть параметр verify_peer и verify_host. Если я хорошо помню, verify_peer проверяет, что сертификат подписан доверенным органом, а verify_host проверяет, что сертификат был выдан хосту, к которому вы подключаетесь.

В файле readme содержится информация об использовании самозаверяющих сертификатов: https://github.com/dbalatero/typhoeus

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...