복붙노트

[RUBY-ON-RAILS] OmniAuth 및 페이스 북 : 인증서 확인 실패 [중복]

RUBY-ON-RAILS

OmniAuth 및 페이스 북 : 인증서 확인 실패 [중복]

나는 시도하고 최소한의 페이스 북 인증을 설정 Railscast # 235을 따랐습니다.

라이언 자신에 의해 수행으로 내가 먼저, 트위터 인증을 설정했습니다. 그것은 완벽했다.

그때 페이스 북 로그인을 추가하는에 옮겼습니다. 그러나, 리디렉션 응용 프로그램을 승인 후에 / 인증 / 페이스 북 / 콜백 실패 :

SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

나는 로컬 호스트에서 일하고 있습니다. 나는 응용 프로그램 내 모든 SSL을 설정하지 않았다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

해결법

  1. ==============================

    1.진짜 문제는 패러데이가 (자신의 HTTP 호출의 어떤 Omniauth /의 Oauth 사용) OpenSSL에 대한 ca_path 변수를 설정하지 않은되지 않는 것입니다. 우분투에 적어도 대부분의 루트 인증서에서는 "을 / etc / SSL / 인증서 표시"에 저장됩니다. 패러데이가 (그렇게 할 방법이없는 현재와)이 변수를 설정하지 않은되지 않기 때문에, OpenSSL이 페이스 북의 SSL 인증서의 루트 인증서를 찾는되지 않았습니다되지 않습니다.

    진짜 문제는 패러데이가 (자신의 HTTP 호출의 어떤 Omniauth /의 Oauth 사용) OpenSSL에 대한 ca_path 변수를 설정하지 않은되지 않는 것입니다. 우분투에 적어도 대부분의 루트 인증서에서는 "을 / etc / SSL / 인증서 표시"에 저장됩니다. 패러데이가 (그렇게 할 방법이없는 현재와)이 변수를 설정하지 않은되지 않기 때문에, OpenSSL이 페이스 북의 SSL 인증서의 루트 인증서를 찾는되지 않았습니다되지 않습니다.

    나는이 변수에 대한 지원을 추가하고 잘하면 그들이 곧 변화를 가져옵니다 패러데이에 풀 요청을 제출했습니다. 그 때까지, 당신은 다음과 같이 또는 패러데이의 내 포크를 사용하는 패러데이 monkeypatch 수 있습니다. 그 후, 당신은 패러데이을 통해 SSL 옵션의 통과를 지원하여 Gemspec에서 OAuth2를 보석의 버전 0.3.0을 지정해야합니다. 당신이 지금 할 필요는 ca_path 변수의 전달을 지원 패러데이 0.6.1로 업그레이드하고 OAuth2를위한 적절한 종속성이 OmniAuth 0.2.2로 업그레이드됩니다. 그런 다음 제대로 단지 초기화하여 Omniauth에 다음을 추가하여이 문제를 해결할 수 있습니다 :

    Rails.application.config.middleware.use OmniAuth::Builder do
        provider :facebook, FACEBOOK_KEY, FACEBOOK_SECRET, {:client_options => {:ssl => {:ca_path => "/etc/ssl/certs"}}}
    end
    

    그래서, 요약하자면 :

    희망 패러데이와 Omniauth 모두의 다음 릴리스는이 솔루션을 통합 할 예정이다.

    옳은 길에 저를 설정하기위한 위 KirylP 감사합니다.

  2. ==============================

    2.나는이 문제를 갖고, 사용하여 시도했다 : 성공하지 ca_path 인수를. 잠시 Github에서를 통해보고 후, 나는 사용하여 언급 제안 건너 온 : ca_file 및 지점을 직접 인증에.

    나는이 문제를 갖고, 사용하여 시도했다 : 성공하지 ca_path 인수를. 잠시 Github에서를 통해보고 후, 나는 사용하여 언급 제안 건너 온 : ca_file 및 지점을 직접 인증에.

    Rails.application.config.middleware.use OmniAuth::Builder do
      provider :facebook, 'secret_key', 'secret_key',
       :client_options => {:ssl => {:ca_file => '/etc/pki/tls/certs/ca-bundle.crt'}}}
    end
    

    당신이 당신의 시스템 인증 파일 (및 사용하여 Linux)에 대한 경로를 얻을 필요가있는 경우 단순히 터미널에서 입력합니다. 이 경로 (OPENSSLDIR 참조)을 포함하여 SSL 설정에 대해 당신에게 정보의 무리를 줄 것이다. 당신이 제공하는 경로에 인증서 표시 / CA-bundle.crt를 추가해야합니다.

    open-ssl version -a
    
  3. ==============================

    3.나는 10.10 (매버릭) 우분투 오전 ... 나는 일에 도착하기 전에 6 시간에 대해 고투 내 경험을 공유

    나는 10.10 (매버릭) 우분투 오전 ... 나는 일에 도착하기 전에 6 시간에 대해 고투 내 경험을 공유

    작업에 만든 유일한 것은 다음되었다 (감사 알렉스)

    if Rails.env.development? 
      OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE 
    end
    
  4. ==============================

    4.가 있어야한다처럼 SSL 인증서 검증을 통과 할 수 있었다. 내 프로젝트 (3.0.4 레일, 루비 1.9.2-P130)베이스 캠프 통합을 위해 37 시그널의 ID를 사용하고 있습니다.

    가 있어야한다처럼 SSL 인증서 검증을 통과 할 수 있었다. 내 프로젝트 (3.0.4 레일, 루비 1.9.2-P130)베이스 캠프 통합을 위해 37 시그널의 ID를 사용하고 있습니다.

    RAILS_ROOT / 설정 / 초기화 / omniauth.rb :

    require 'omniauth/oauth'
    
    Rails.application.config.middleware.use OmniAuth::Strategies::ThirtySevenSignals,
        'CLIENT_ID', 'CLIENT_SECRET', {client_options: {ssl: {ca_file: Rails.root.join('gd_bundle.crt').to_s}}}
    
    module OAuth2
      class Client
        def initialize(client_id, client_secret, opts = {})
          adapter = opts.delete(:adapter)
          self.id = client_id
          self.secret = client_secret
          self.site = opts.delete(:site) if opts[:site]
          self.options = opts
          self.connection = Faraday::Connection.new(site, {ssl: opts.delete(:ssl)})
          self.json = opts.delete(:parse_json)        # ^ my code starts here
    
          if adapter && adapter != :test
            connection.build { |b| b.adapter(adapter) }
          end
        end
      end
    end
    

    37 시그널은 자신의 CA를 사용하고 있기 때문에 어디 CLIENT_ID ','CLIENT_SECRET '당신은 37signals.com에서 얻을 수 있으며, 인증서에서 GoDaddy에서 파일 gd_bundle.crt 번들

  5. ==============================

    5.당신에게 Heroku에 배포하는 경우 특정 파일의 위치를 ​​가리 키도록합니다. 이것은 (설정 / 초기화 / omniauth.rb에서) 나를 위해 작동합니다 :

    당신에게 Heroku에 배포하는 경우 특정 파일의 위치를 ​​가리 키도록합니다. 이것은 (설정 / 초기화 / omniauth.rb에서) 나를 위해 작동합니다 :

    Rails.application.config.middleware.use OmniAuth::Builder do
      # This cert location is only for Heroku
      provider :facebook, APP_ID, APP_SECRET, {:client_options => {:ssl => {:ca_file => "/usr/lib/ssl/certs/ca-certificates.crt"}}}
    end
    
  6. ==============================

    6.나는에서 CA 번들이 해결 : http://certifie.com/ca-bundle/

    나는에서 CA 번들이 해결 : http://certifie.com/ca-bundle/

    그리고 내 유증 이니셜 라이저에서 :

    :client_options => { :ssl => { :ca_file => "#{Rails.root}/config/ca-bundle.crt" } } }
    
  7. ==============================

    7.Omniauth 것 같은데 지금은 원숭이 패치 위에서 나를 위해 작동하지 않는 이유를 설명 패러데이의 최신 버전을 사용합니다. 나는 더 나은 방법이 있어야합니다 동의하지만, 단지 필요로 다른 사람이이 테스트 작업을 진행하기 위해, 여기에 업데이트 된 버전입니다 :

    Omniauth 것 같은데 지금은 원숭이 패치 위에서 나를 위해 작동하지 않는 이유를 설명 패러데이의 최신 버전을 사용합니다. 나는 더 나은 방법이 있어야합니다 동의하지만, 단지 필요로 다른 사람이이 테스트 작업을 진행하기 위해, 여기에 업데이트 된 버전입니다 :

    (다음 코드를 사용하여 초기화 디렉토리에서 파일을 작성)

    require 'faraday'
    module Faraday
    class Adapter
     class NetHttp < Faraday::Adapter
      def call(env)
      super
      url = env[:url]
      req = env[:request]
    
      http = net_http_class(env).new(url.host, url.inferred_port)
    
      if http.use_ssl = (url.scheme == 'https' && env[:ssl])
        ssl = env[:ssl]
        http.verify_mode = OpenSSL::SSL::VERIFY_NONE
        http.cert        = ssl[:client_cert] if ssl[:client_cert]
        http.key         = ssl[:client_key]  if ssl[:client_key]
        http.ca_file     = ssl[:ca_file]     if ssl[:ca_file]
        http.cert_store  = ssl[:cert_store]  if ssl[:cert_store]
      end
    
      http.read_timeout = http.open_timeout = req[:timeout] if req[:timeout]
      http.open_timeout = req[:open_timeout]                if req[:open_timeout]
    
      if :get != env[:method]
        http_request = Net::HTTPGenericRequest.new \
          env[:method].to_s.upcase,    # request method
          !!env[:body],                # is there data
          true,                        # does net/http love you, true or false?
          url.request_uri,             # request uri path
          env[:request_headers]        # request headers
    
        if env[:body].respond_to?(:read)
          http_request.body_stream = env[:body]
          env[:body] = nil
        end
      end
    
      begin
        http_response = if :get == env[:method]
          # prefer `get` to `request` because the former handles gzip (ruby 1.9)
          http.get url.request_uri, env[:request_headers]
        else
          http.request http_request, env[:body]
        end
      rescue Errno::ECONNREFUSED
        raise Error::ConnectionFailed, $!
      end
    
      http_response.each_header do |key, value|
        response_headers(env)[key] = value
      end
      env.update :status => http_response.code.to_i, :body => http_response.body
    
      @app.call env
    end
    end
    end
    end
    
  8. ==============================

    8.모두 나를 위해 솔루션 didnt 한 작업의 다음 이걸 발견했습니다

    모두 나를 위해 솔루션 didnt 한 작업의 다음 이걸 발견했습니다

    http://railsapps.github.io/openssl-certificate-verify-failed.html

    rvm osx-ssl-certs update all
    

    RVM을 통해 OSX 10.8 루비 2.0.0

  9. ==============================

    9.편집 : 더 관련이로 아래에 답을 확인

    편집 : 더 관련이로 아래에 답을 확인

    이것은 (https://github.com/jspooner의 수정 제공) 나를 위해 일한 :

    다음 원숭이 패치와 초기화의 디렉토리에있는 파일을 만듭니다

    require 'faraday'
    module Faraday
    class Adapter
     class NetHttp < Faraday::Adapter
      def call(env)
        super
    
        is_ssl = env[:url].scheme == 'https'
    
        http = net_http_class(env).new(env[:url].host, env[:url].port || (is_ssl ? 443 : 80))
        if http.use_ssl = is_ssl
          ssl = env[:ssl]
          if ssl[:verify] == false
            http.verify_mode = OpenSSL::SSL::VERIFY_NONE
          else
            http.verify_mode = OpenSSL::SSL::VERIFY_NONE # <= PATCH or HACK ssl[:verify]
          end
          http.cert    = ssl[:client_cert] if ssl[:client_cert]
          http.key     = ssl[:client_key]  if ssl[:client_key]
          http.ca_file = ssl[:ca_file]     if ssl[:ca_file]
        end
        req = env[:request]
        http.read_timeout = net.open_timeout = req[:timeout] if req[:timeout]
        http.open_timeout = req[:open_timeout]               if req[:open_timeout]
    
        full_path = full_path_for(env[:url].path, env[:url].query, env[:url].fragment)
        http_req  = Net::HTTPGenericRequest.new(
          env[:method].to_s.upcase,    # request method
          (env[:body] ? true : false), # is there data
          true,                        # does net/http love you, true or false?
          full_path,                   # request uri path
        env[:request_headers])       # request headers
    
        if env[:body].respond_to?(:read)
          http_req.body_stream = env[:body]
          env[:body] = nil
        end
    
        http_resp = http.request http_req, env[:body]
    
        resp_headers = {}
        http_resp.each_header do |key, value|
          resp_headers[key] = value
        end
    
        env.update \
          :status           => http_resp.code.to_i,
          :response_headers => resp_headers,
          :body             => http_resp.body
    
        @app.call env
      rescue Errno::ECONNREFUSED
        raise Error::ConnectionFailed.new(Errno::ECONNREFUSED)
      end
    
      def net_http_class(env)
        if proxy = env[:request][:proxy]
          Net::HTTP::Proxy(proxy[:uri].host, proxy[:uri].port, proxy[:user], proxy[:password])
        else
          Net::HTTP
        end
      end
     end
    end
    end
    
  10. ==============================

    10.나는 패러데이 0.6.1, 및 (만, 아무것도 래핑되지 않음) OAUTH2를 사용하고 있습니다. 이것은 (젠투에 Ubunto에서 작동해야) 나를 위해 문제를 해결하기에 충분했다

    나는 패러데이 0.6.1, 및 (만, 아무것도 래핑되지 않음) OAUTH2를 사용하고 있습니다. 이것은 (젠투에 Ubunto에서 작동해야) 나를 위해 문제를 해결하기에 충분했다

    이십시오

      client = OAuth2::Client.new(FACEBOOK_API_KEY, FACEBOOK_API_SECRET, :site => FACEBOOK_API_SITE)
    

    이 속으로

      client = OAuth2::Client.new(FACEBOOK_API_KEY, FACEBOOK_API_SECRET, :site => FACEBOOK_API_SITE, :ssl => {:ca_path => '/etc/ssl/certs' })
    
  11. ==============================

    11.내 문제는 OpenSSL을 올바른 인증서 디렉토리를 사용하는 것을 보장함으로써 해결되었다 :

    내 문제는 OpenSSL을 올바른 인증서 디렉토리를 사용하는 것을 보장함으로써 해결되었다 :

    내 시스템 (ubuntu64)의 경우이 있었다 : ENV [ 'SSL_CERT_DIR'= '은 / usr / 공유 / CA-인증서 /'

    이 JRuby에서 1.6.0과 JRuby를-하려면 openssl을 사용했다

    난 그냥 development.rb이 설정을 추가

  12. ==============================

    12.나는이 소리가 사소한 알아,하지만 당신이 올바른 프로토콜을 사용합니다. 나는이 오류가 발생하고 내가 HTTP를 통해 연결을 시도하는 것을 깨달았다 유지했다. 내가 바보이기 때문에 1.5 시간 낭비.

    나는이 소리가 사소한 알아,하지만 당신이 올바른 프로토콜을 사용합니다. 나는이 오류가 발생하고 내가 HTTP를 통해 연결을 시도하는 것을 깨달았다 유지했다. 내가 바보이기 때문에 1.5 시간 낭비.

  13. ==============================

    13.이것은 1.9.x의 문제가 될 것으로 보인다. 1.8.7으로 되 돌리는 문제를 해결했습니다.

    이것은 1.9.x의 문제가 될 것으로 보인다. 1.8.7으로 되 돌리는 문제를 해결했습니다.

  14. ==============================

    14.여기에 내가 특별히 레오파드에 문제가있는 경우 도움이되었다고 무슨 짓을했는지.

    여기에 내가 특별히 레오파드에 문제가있는 경우 도움이되었다고 무슨 짓을했는지.

    내 CERT는 과거와 갱신 ​​될 필요가 있었다. 나는이 다운로드 :

    http://curl.haxx.se/ca/cacert.pem

    그리고 레오파드 여기에 발견되었다 내 인증서를 대체 :

    /usr/share/curl/curl-ca-bundle.crt

    새로 고침은 무엇이든 당신은 그것을 접근 그리고 당신이 좋은 이동해야 해!

  15. ==============================

    15.지침은 나를 위해 일한 것에 대해 약간의 비트 차이가 있었다해서, 나는 내 2 센트를 추가 생각 :

    지침은 나를 위해 일한 것에 대해 약간의 비트 차이가 있었다해서, 나는 내 2 센트를 추가 생각 :

    나는 OS X 사자에있어 및 MacPorts를하고 RVM을 사용하여

    나는 컬-CA-번들을 설치 :

    sudo port install curl-ca-bundle
    

    그럼 내가이 일을 내 omniauth 설정을 조정 :

    Rails.application.config.middleware.use OmniAuth::Builder do
      provider :google_oauth2, APP_CONFIG['CONSUMER_KEY'], APP_CONFIG['CONSUMER_SECRET'],
               :scope => 'https://www.google.com/m8/feeds https://www.googleapis.com/auth/userinfo.profile',
               :ssl => {:ca_path => "/share/curl/curl-ca-bundle.crt"}
    end
    
  16. ==============================

    16.우분투에서 모든 난에 업데이트 /environments/development.rb이었다해야했다 :

    우분투에서 모든 난에 업데이트 /environments/development.rb이었다해야했다 :

    Rails.application.config.middleware.use OmniAuth::Builder do
        provider :facebook, FACEBOOK_KEY, FACEBOOK_SECRET, {:client_options => {:ssl => {:ca_path => "/etc/ssl/certs"}}}
    end
    

    그리고:

    cd /etc/ssl/certs
    sudo wget http://curl.haxx.se/ca/cacert.pem
    

    것입니다!

  17. ==============================

    17.나는 마지막으로 산 사자에 대한 수정을 발견했다. 참조 : http://coderwall.com/p/f4hyqw

    나는 마지막으로 산 사자에 대한 수정을 발견했다. 참조 : http://coderwall.com/p/f4hyqw

    rvm pkg install openssl
    rvm reinstall 1.9.3 --with-openssl-dir=$rvm_path/usr
    
  18. ==============================

    18.나는 산 사자에 RVM을 사용하여 유사한 오류가 발생했습니다. 루비는 SSL 연결 권한을 부여 할 필요가 CA 인증서를 찾을 수없는 것 같다. 당신은 하나를 설치해야합니다. 이 솔루션은 속임수를 썼는지 :

    나는 산 사자에 RVM을 사용하여 유사한 오류가 발생했습니다. 루비는 SSL 연결 권한을 부여 할 필요가 CA 인증서를 찾을 수없는 것 같다. 당신은 하나를 설치해야합니다. 이 솔루션은 속임수를 썼는지 :

    http://fredwu.me/post/28834446907/fix-openssl-error-on-mountain-lion-and-rvm

    (실제로 브라우저에서 해당 페이지를로드 할 수 있지만, 나는 구글 캐시에서 찾을했다.)

    여기에 짧은 대답입니다 :

    http://curl.haxx.se/ca/cacert.pem 컬, 또는 ~ / .rvm는 / usr / SSL / cert.pem

    그리고 당신은 완료됩니다.

  19. from https://stackoverflow.com/questions/3977303/omniauth-facebook-certificate-verify-failed by cc-by-sa and MIT license