2011-11-02 31 views
6

Tôi đang làm việc trên ứng dụng cho ứng dụng khách yêu cầu kết nối SSL với API. Tôi đã được cung cấp ba tập tin; tệp chứng chỉ gốc tin cậy (.cer), tệp chứng chỉ trung gian (.cer) và tệp phản hồi đã ký. Các hướng dẫn tôi đã được đưa ra để cài đặt liên quan này đến IIS hoặc chương trình keytool Java; Tôi đang xây dựng ứng dụng trong Ruby on Rails vì vậy không phải là một tùy chọn (theo như tôi biết).Sử dụng ứng dụng khách SSL trong ứng dụng Ruby on Rails

Chứng chỉ được ký tự bởi tổ chức đang điều hành dịch vụ API và có vẻ như tôi nhận được chứng chỉ ứng dụng khách để xác thực lẫn nhau kết nối https. Tôi không chắc chắn làm thế nào để

  1. sử dụng giấy chứng nhận trong ứng dụng của tôi để kết nối và sử dụng API
  2. những gì các tệp biên bản có chữ ký không

Tôi đã đọc "Using a self-signed certificate"this article on OpenSSL in Ruby nhưng không phải dường như khá nhấn tại chỗ (và cả hai đều có một số phụ thuộc vào Java/JRuby gây nhầm lẫn mọi thứ).

Mọi con trỏ sẽ được đánh giá cao.

+0

Chỉ cần làm rõ, bài viết mathish.com bạn đã liên kết không thực sự có liên quan gì đến jRuby. Mã mà tôi đã giới thiệu đã phải nói chuyện với một nhà môi giới thư ActiveMQ, dựa trên Java và sử dụng các quy ước chứng chỉ SSL của Java. Phần lớn các nhận xét trong mã đó đã có để nhắc tôi cách lấy chứng chỉ SSL của Java ra khỏi kho khóa và vào một định dạng mà OpenSSL sẽ nhận ra. –

+0

Nếu bạn mở các tệp .cer trong trình soạn thảo văn bản, chúng có bắt đầu bằng '----- BEGIN CERTIFICATE -----' hoặc một cái gì đó khác không? –

+0

Hey @ian, cảm ơn vì đã làm rõ điều đó. Chúng không bắt đầu bằng '----- BEGIN CHỨNG NHẬN ----- '; Không. Mở nó bằng trình soạn thảo văn bản; có vẻ như nội dung được mã hóa trong một số thời trang (chỉ là một chuỗi ký tự ASCII ngẫu nhiên và khoảng trắng, không có chữ cái rõ ràng). – jkale

Trả lời

4

Dựa trên ý kiến ​​của bạn, tôi giả định rằng các chứng chỉ có định dạng DER, mà bạn có thể chuyển đổi sang PEM với openssl x509 lệnh (xem: openssl x509 command):

openssl x509 -inform DER -outform PEM -in certfile.cer -out certfile.pem 

Sau đó, bạn có thể hướng dẫn thư viện của Ruby OpenSSL để sử dụng chứng chỉ gốc tin cậy để xác thực các kết nối SSL với một cái gì đó như thế này:

require 'socket' 
require 'openssl' 

tcp_sock = TCPSocket.new("my.host.tld", 443) 
ctx = OpenSSL::SSL::SSLContext.new 
ctx.verify_mode = OpenSSL::SSL::VERIFY_PEER|OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT 
#You may need to specify the absolute path to the file 
ctx.ca_file = "certfile.pem" 

ssl_sock = OpenSSL::SSL::SSLSocket.new(tcp_sock, ctx) 
ssl_sock.sync_close = true 
ssl_sock.connect 
begin 
    ssl_sock.post_connection_check('my.host.tld') 
rescue 
    puts "Certificate host did not match expected hostname" 
end 

Sau đó, bạn sẽ có thể đọc và ghi vào ssl_sock giống như bất kỳ đối tượng của Ruby IO khác. Nếu bạn có một giấy chứng nhận của khách hàng sử dụng để cho phép các máy chủ để xác thực bạn, bạn có thể cấu hình các bối cảnh SSL với:

ctx.cert = OpenSSL::X509::Certificate.new(File.read("my_cert.pem")) 
ctx.key = OpenSSL::PKey::RSA.new(File.read("my_key.rsa")) 

trước khi bạn tạo ssl_sock. Thư viện OpenSSL cũng hỗ trợ các loại khóa khác ngoài RSA, chẳng hạn như DSA (xem: OpenSSL::PKey module.)

Cuối cùng, một lời khuyên cuối cùng, nếu bạn đang truy cập RESTful API, bạn có thể cân nhắc sử dụng một viên đá quý như rest-client thay vì xử lý tất cả các công cụ kết nối HTTP/S trực tiếp. Có hay không một thư viện như vậy là thích hợp hoặc hữu ích sẽ phụ thuộc vào dịch vụ bạn đang sử dụng, tất nhiên.

+0

Chỉ cần lưu ý rằng không giống như thuộc tính 'ca_file' trên các đối tượng' SSLContext', 'cert' và' key' yêu cầu dữ liệu tệp thực, không chỉ tên tệp. –

+0

Bạn cũng không phải thực hiện 'post_connection_check' và khối' begin ... rescue' xung quanh nếu bạn không quan tâm đến việc xác minh tên trên chứng chỉ. –

+0

Dòng 4 của khối mã lớn phải là 'tcp_sock' thay vì' sock' – SnareChops

Các vấn đề liên quan