Я младший разработчик рельсов.У меня есть один сайт с сертификатом Nginx auth .Для генерации некоторого клиентского сертификата я запускаю следующие команды в оболочке:
openssl genrsa -des3 -out /etc/ssl/ca/certs/users/ivan.key 1024
openssl req -new -key /etc/ssl/ca/certs/users/ivan.key \
-out /etc/ssl/ca/certs/users/ivan.csr
openssl x509 -req -days 1095 \
-in /etc/ssl/ca/certs/users/ivan.csr \
-CA /etc/nginx/ssl/ca/certs/myapp.net.crt \
-CAkey /etc/nginx/ssl/ca/private/myapp.net.key \
-CAserial /etc/ssl/ca/serial \
-CAcreateserial \
-out /etc/ssl/ca/certs/users/ivan.crt
openssl pkcs12 -export -clcerts \
-in /etc/ssl/ca/certs/users/ivan.crt \
-inkey /etc/ssl/ca/certs/users/ivan.key \
-out /etc/ssl/ca/certs/users/ivan.p12
После этого у меня есть один сертификат .p12, который я могу установить в своем браузере и затем работать с сайтом.Поэтому я пытался написать одно приложение с RoR для генерации сертификатов клиентов для наших пользователей.
Я обнаружил, что у rails Openssl gem , я скачал myapp.net.key и myapp.net.crt с моего сервера на локальный компьютер, я поместил эти файлы в папку vendor (только для тестирования) на локальном компьютере.Чем я написал этот код:
# Open server CA .crt and .key
ca = OpenSSL::X509::Certificate.new( File.read("vendor/myapp.net.crt") )
ca_key = OpenSSL::PKey::RSA.new( File.read("vendor/myapp.net.key"), 'PassPhraseForKey' )
# Create key
keypair = OpenSSL::PKey::RSA.new( 1024 )
# Create certificate
req = OpenSSL::X509::Request.new
req.version = 0
req.subject = OpenSSL::X509::Name.parse(
"/C=IT/ST=Moscow/L=Moscow/O=Test ltd./OU=Test ltd./CN=myapp.net/emailAddress=my@email.net"
)
req.public_key = keypair.public_key
req.sign( keypair, OpenSSL::Digest::SHA1.new )
cert = OpenSSL::X509::Certificate.new
cert.version = 2
cert.serial = rand( 999999 ) # but on serial file on my server serial is - "D9FD16BA10" - **May be problem is here?**
cert.not_before = Time.now
cert.not_after = cert.not_before + 1 * 365 * 24 * 60 * 60
cert.public_key = req.public_key
cert.subject = req.subject
cert.issuer = ca.subject
ef = OpenSSL::X509::ExtensionFactory.new
ef.subject_certificate = cert
ef.issuer_certificate = ca
cert.sign( ca_key, OpenSSL::Digest::SHA1.new )
# Generate .p12 certificate for browser
File.open('vendor/client.crt', 'w') { |file| file.write(cert) }
p12 = OpenSSL::PKCS12.create("PassPhrase", "test", keypair.public_key, cert)
File.open('vendor/client.p12', 'w') { |file| file.write(p12.certificate) }
Когда мой скрипт завершает работу, у меня есть сертификат client.p12, но если я пытаюсь получить доступ к сайту с этим сертификатом - у меня 400 Ошибка неверного запроса
Nginx отклоняет этот сертификат.
Что я делаю не так?Спасибо