web-dev-qa-db-ja.com

CURL(51)SSLエラーを修正:代替の証明書サブジェクト名が一致しません

私はWindows + .NETドメインから来たCURLの世界に新しいです。

http://www.evercam.io/docs/api/v1/authentication で基本認証のためにREST APIにアクセスしようとしています。

curl -X GET https://api.evercam.io/v1/... \
-u {username}

CURLのセットアップが正常に完了した後、Windowsコマンドプロンプトでこのコマンドを使用する方法がわかりません。次のようにCURLをテストしました。

C:\>curl --version
curl 7.33.0 (x86_64-pc-win32) libcurl/7.33.0 OpenSSL/0.9.8y zlib/1.2.8 libssh2/1.4.3
Protocols: dict file ftp ftps Gopher http https imap imaps pop3 pop3s rtsp scp s
ftp smtp smtps telnet tftp
Features: AsynchDNS GSS-Negotiate Largefile NTLM SSL SSPI libz

今、私はこれで終わっています

C:\>curl -u myuser:mypassword -X GET https://api.evercam.io/v1/
curl: (51) SSL: no alternative certificate subject name matches target Host name 'api.evercam.io'

このSSL問題51エラーを修正するにはどうすればよいですか?

50
theGeekster

通常、証明書がホスト名と一致しない場合に発生します。

解決策は、ホストに連絡して証明書を修正するように依頼することです。
それ以外の場合は、証明書のcURLの検証をオフにできます。-k(または--insecure)オプションを使用します。
オプションが言ったように、insecureであることに注意してください。このオプションは自己署名証明書を許可するため、本番環境では使用しないでください。

詳細はこちらをご覧ください: http://curl.haxx.se/docs/sslcerts.html

76
Sabuj Hassan

私はそれが(非常に)古い質問であり、コマンドラインに関するものであることを知っていますが、Googleで「SSL:ターゲットホスト名に一致する代替証明書サブジェクト名がない」を検索したとき、これが最初のヒットでした。

答えを見つけるのにかなり時間がかかったので、これが誰かの時間を大幅に節約することを願っています! PHPで、これをcUrl setoptsに追加します。

curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);

p.s:これは一時的な解決策です。これは証明書エラーであるため、証明書をもちろん修正することをお勧めします!

61
JD_N_PHP

api.evercam.ioの証明書の共通名は*.herokuapp.comの名前であり、証明書には代替のサブジェクト名はありません。これは、api.evercam.ioの証明書がホスト名と一致しないため、証明書の検証が失敗することを意味します。 www.evercam.ioの場合と同じ、たとえばブラウザで https://www.evercam.io を試してみると、証明書の名前がホスト名と一致しないというエラーメッセージが表示されます。

そのため、evercam.ioで修正する必要がある問題です。セキュリティ、中間者攻撃などを気にしない場合は、証明書の検証を無効にすることがあります(curl --insecure)が、httpではなくhttpsを使用する理由を自問する必要があります。

20
Steffen Ullrich

誰かの時間を節約できるかもしれません。

GuzzleHttpを使用し、このエラーメッセージcURLエラー60に直面した場合:SSL:代替証明書サブジェクト名がターゲットホストに一致しないnameで、「安全でない」ソリューション(本番環境では推奨されません)で問題ない場合は、\GuzzleHttp\RequestOptions::VERIFY => falseをクライアント構成に追加する必要があります。

$this->client = new \GuzzleHttp\Client([
    'base_uri'                          => 'someAccessPoint',
    \GuzzleHttp\RequestOptions::HEADERS => [
        'User-Agent' => 'some-special-agent',
    ],
    'defaults'                          => [
        \GuzzleHttp\RequestOptions::CONNECT_TIMEOUT => 5,
        \GuzzleHttp\RequestOptions::ALLOW_REDIRECTS => true,
    ],
    \GuzzleHttp\RequestOptions::VERIFY  => false,
]);

CurlFactory::applyHandlerOptions()メソッドでCURLOPT_SSL_VERIFYHOSTを0に、CURLOPT_SSL_VERIFYPEERをfalseに設定します

$conf[CURLOPT_SSL_VERIFYHOST] = 0;
$conf[CURLOPT_SSL_VERIFYPEER] = false;

GuzzleHttpドキュメント から

verify

要求のSSL証明書の検証動作について説明します。

  • SSL証明書の検証を有効にし、オペレーティングシステムが提供するデフォルトのCAバンドルを使用するには、trueに設定します。
  • 証明書の検証を無効にするにはfalseに設定します(これは安全ではありません!)。
  • カスタム証明書を使用した検証を有効にするために、CAバンドルへのパスを提供する文字列に設定します。
1
Zoltán Süle

エラーコードに示されているように、「代替ホスト名に一致する代替証明書サブジェクト名はありません」-SSL証明書に問題があります。

証明書にはSANが含まれている必要があり、SANのみが使用されます。一部のブラウザは、廃止された共通名を無視します。

RFC 2818には、「dNSName型のsubjectAltName拡張が存在する場合、それをIDとして使用する必要があります。それ以外の場合、証明書のSubjectフィールドの(最も具体的な)Common Nameフィールドを使用する必要があります。名前は既存の慣習であり、推奨されておらず、代わりにdNSNameを使用することを証明機関に推奨します。」

0
povlhp

同じ問題がありました。私の場合、digitaloceanとnginxを使用していました。
まず、digitaloceanでドメインexample.appとサブドメインdev.exemple.appをセットアップしました。次に、godaddyから2つのSSL証明書を購入しました。最後に、nginxで2つのドメインを構成して、次のsnipetでこれらの2つのssl証明書を使用します

私のexample.appドメイン設定

    server {
    listen 7000 default_server;
    listen [::]:7000 default_server;

     listen 443 ssl default_server;
     listen [::]:443 ssl default_server;

    root /srv/nodejs/echantillonnage1;

    # Add index.php to the list if you are using PHP
    index index.html index.htm index.nginx-debian.html;

    server_name echantillonnage.app;
    ssl_certificate /srv/nodejs/certificatSsl/widcardcertificate/echantillonnage.app.chained.crt;
    ssl_certificate_key /srv/nodejs/certificatSsl/widcardcertificate/echantillonnage.app.key;

    location / {
            # First attempt to serve request as file, then
            # as directory, then fall back to displaying a 404.
            proxy_pass http://127.0.0.1:8090;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $Host;
            proxy_cache_bypass $http_upgrade;
    #try_files $uri $uri/ =404;
    }
 }

私のdev.example.app

   server {
    listen 7000 default_server;
    listen [::]:7000 default_server;

     listen 444 ssl default_server;
     listen [::]:444 ssl default_server;

    root /srv/nodejs/echantillonnage1;

    # Add index.php to the list if you are using PHP
    index index.html index.htm index.nginx-debian.html;

    server_name dev.echantillonnage.app;
    ssl_certificate /srv/nodejs/certificatSsl/dev/dev.echantillonnage.app.chained.crt;
    ssl_certificate_key /srv/nodejs/certificatSsl/dev/dev.echantillonnage.app.key;

    location / {
            # First attempt to serve request as file, then
            # as directory, then fall back to displaying a 404.
            proxy_pass http://127.0.0.1:8091;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $Host;
            proxy_cache_bypass $http_upgrade;
    #try_files $uri $uri/ =404;
    }
 }

https://dev.echantillonnage.app を起動したとき、

    Fix CURL (51) SSL error: no alternative certificate subject name matches

私の間違いは以下の2行でした

    listen 444 ssl default_server;
     listen [::]:444 ssl default_server;

これを次のように変更する必要がありました。

     listen 443 ssl;
     listen [::]:443 ssl;
0
onlyme