2015-04-20 9 views
9

Provo a creare una richiesta POST con SSL ma senza OpenSSL :: SSL :: VERIFY_NONE perché è in grado di attaccare gli attacchi di sicurezza e senza certificato PEM. Ma io individuare i problemi, il mio codice Ruby per la richiesta di invio POST:Ruby Sinatra crea richiesta post senza PEM e OpenSSL :: SSL :: VERIFY_NONE

post '/test/test1' do 
    cross_origin 
    post_data = request.body.read 
    res_Data = JSON.parse(post_data) 
    userName = res_Data['username'] 

    @responseFromServer='' 
    uri = URI('https://test.com/test1') 
    Net::HTTP.start(uri.host, uri.port, 
        :use_ssl => uri.scheme == 'https', 
        :verify_mode => OpenSSL::SSL::VERIFY_NONE) do |http| 
    request = Net::HTTP::Post.new uri.request_uri 
    request.basic_auth 'aa', 'bb' 
    request.body = {'username' =>userName}.to_json 
    response = http.request request 
    @responseFromServer = response.body.to_s 
    end 
    newJson = JSON.parse(@responseFromServer) 

    status_msg = newJson['status']['status_msg'] 
    if (status_msg == "Success") 
    return 'true' 
    end 
    return 'false' 
end 

È metodo ha funzionato ma usare OpenSSL :: SSL :: VERIFY_NONE. Come creare un metodo per inviare la richiesta POST senza OpenSSL :: SSL :: VERIFY_NONE e Sertificate PEM?

EDIT SSL/HTTPS richiesta Update: Ci sono alcune buone ragioni per cui questo esempio di codice è male. Introduce una potenziale vulnerabilità di sicurezza se è essenziale utilizzare il certificato del server per verificare l'identità del server a cui ci si sta connettendo. C'è una soluzione per il problema però!

require "net/https" 
require "uri" 

uri = URI.parse("https://secure.com/") 
http = Net::HTTP.new(uri.host, uri.port) 
http.use_ssl = true 
http.verify_mode = OpenSSL::SSL::VERIFY_NONE 

request = Net::HTTP::Get.new(uri.request_uri) 

response = http.request(request) 
response.body 
response.status 
response["header-here"] # All headers are lowercase 

SSL/HTTPS richiesta con certificato PEM

require "net/https" 
require "uri" 

uri = URI.parse("https://secure.com/") 
pem = File.read("/path/to/my.pem") 
http = Net::HTTP.new(uri.host, uri.port) 
http.use_ssl = true 
http.cert = OpenSSL::X509::Certificate.new(pem) 
http.key = OpenSSL::PKey::RSA.new(pem) 
http.verify_mode = OpenSSL::SSL::VERIFY_PEER 

request = Net::HTTP::Get.new(uri.request_uri) 

La mia domanda: Come creare il metodo POST senza PEM e OpenSSL :: SSL :: VERIFY_NONE?

+2

Questo potrebbe aiutare: http://stackoverflow.com/questions/1113422/how-to-bypass-ssl-certificate-verification-in-open-uri – karlingen

+0

@karlingen Intendi cosa ho bisogno di usare ** OpenSSL: : SSL :: VERIFY_PEER = OpenSSL :: SSL :: VERIFY_NONE **? Funziona ma ho bisogno di usare ** POST request senza OpenSSL :: SSL :: VERIFY_NONE ** –

+0

@karlingen O se uso ** OpenSSL :: SSL :: VERIFY_PEER = OpenSSL :: SSL :: VERIFY_NONE ** è risolto il problema della sicurezza? –

risposta

1

Questa domanda è abbastanza fuorviante, ma faccio del mio meglio per capirlo. Ecco il mio consiglio:

Vuoi collegarti a un servizio che è disponibile solo tramite https e non ti interessa se il certificato è valido?

Quindi è possibile utilizzare :verify_mode => OpenSSL::SSL::VERIFY_NONE durante l'inizializzazione del client Net::HTTP. Avrai un qualche tipo di sicurezza del trasporto, ma non puoi essere sicuro che il server con cui stai parlando sia quello che pensi sia. Sei vulnerabile

Vuoi collegarti a un servizio disponibile tramite https e http e non ti interessa la sicurezza del trasporto?

Quindi è necessario utilizzare l'endpoint http://....

Vuoi collegarti a un servizio e ti interessa la sicurezza dei trasporti?

Quindi si consiglia di utilizzare l'endpoint https://.... Non eseguire l'override :verify_mode! Se si verificano errori di verifica del certificato, assicurarsi di aver installato l'autorità di certificazione corretta sul proprio sistema.

Problemi correlati