Я использую 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 .: если вам нужна дополнительная информация, дайте мне знать.