IT Share you

CURL (51) SSL 오류 수정 : 일치하는 대체 인증서 주체 이름이 없습니다.

shareyou 2021. 1. 9. 10:52
반응형

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 오류를 어떻게 해결할 수 있습니까?


일반적으로 인증서가 호스트 이름과 일치하지 않을 때 발생합니다.

해결책은 호스트에 연락하여 인증서 수정을 요청하는 것입니다.
그렇지 않으면 cURL의 인증서 확인을 끄고 -k(또는 --insecure) 옵션을 사용할 수 있습니다.
옵션에서 언급 했듯이 안전하지 않습니다 . 이 옵션은 자체 서명 된 인증서를 허용하므로 프로덕션에서 사용하지 않아야합니다.

자세한 내용은 http://curl.haxx.se/docs/sslcerts.html 에서 찾을 수 있습니다 .


나는 그것이 (매우) 오래된 질문이고 명령 줄에 관한 것이라는 것을 알고 있지만, Google에서 "SSL : 대상 호스트 이름과 일치하는 대체 인증서 주체 이름 없음"을 검색했을 때 이것이 첫 번째 히트였습니다.

답을 찾는 데 시간이 오래 걸렸으므로 이것이 누군가의 시간을 많이 절약하기를 바랍니다! PHP에서 cUrl setopts에 다음을 추가하십시오.

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

추신 : 이것은 임시 해결책이어야합니다. 이것은 인증서 오류이므로 가장 좋은 방법은 인증서를 과정에 수정하는 것입니다!


인증서의 일반 이름 api.evercam.io은 for *.herokuapp.com이며 인증서에 대체 주체 이름이 없습니다. 즉,에 대한 인증서 api.evercam.io가 호스트 이름과 일치하지 않아 인증서 확인에 실패합니다. 의 경우와 동일합니다 www.evercam.io. 예를 들어 브라우저에서 https://www.evercam.io시도 하면 인증서의 이름이 호스트 이름과 일치하지 않는다는 오류 메시지가 표시됩니다.

따라서 evercam.io에서 수정해야 할 문제입니다. 보안, man-in-the-middle 공격 등에 대해 신경 쓰지 않는다면 인증서 확인 ( curl --insecure)을 비활성화 할 수 있지만 http 대신 https를 사용하는 이유를 스스로에게 물어봐야합니다.


누군가에게 시간을 절약 할 수 있습니다.

GuzzleHttp 를 사용 하고이 오류 메시지가 표시 되면 cURL 오류 60 : SSL : 대체 인증서 주체 이름이 대상 호스트 이름일치 하지 않고 '안전하지 않은'솔루션 (프로덕션에서는 권장되지 않음)을 사용해도 괜찮은 \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,
]);

메서드 에서 CURLOPT_SSL_VERIFYHOST0으로 설정 되고 CURLOPT_SSL_VERIFYPEERfalse로 설정 됩니다.CurlFactory::applyHandlerOptions()

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

로부터 GuzzleHttp 문서

검증

요청의 SSL 인증서 확인 동작을 설명합니다.

  • SSL 인증서 확인을 활성화하고 운영 체제에서 제공하는 기본 CA 번들을 사용하려면 true로 설정하십시오.
  • 인증서 확인을 비활성화하려면 false로 설정합니다 (안전하지 않습니다!).
  • 사용자 정의 인증서를 사용하여 검증 할 수 있도록 CA 번들에 대한 경로를 제공하려면 문자열로 설정하십시오.

오류 코드에 "대체 인증서 주체 이름이 대상 호스트 이름과 일치하지 않습니다"라고 표시되어 있으므로 SSL 인증서에 문제가 있습니다.

인증서에는 SAN이 포함되어야하며 SAN 만 사용됩니다. 일부 브라우저는 더 이상 사용되지 않는 일반 이름을 무시합니다.

RFC 2818 clearly states "If a subjectAltName extension of type dNSName is present, that MUST be used as the identity. Otherwise, the (most specific) Common Name field in the Subject field of the certificate MUST be used. Although the use of the Common Name is existing practice, it is deprecated and Certification Authorities are encouraged to use the dNSName instead."


I had the same issue. In my case I was using digitalocean and nginx.
I have first setup a domain example.app and a subdomain dev.exemple.app in digitalocean. Second,I purchased two ssl certificat from godaddy. And finaly, I configured two domain in nginx to use those two ssl certificat with the following snipet

My example.app domain config

    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;
    }
 }

My 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;
    }
 }

When I was launching https://dev.echantillonnage.app , I was getting

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

My mistake was the two lines bellow

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

I had to change this to:

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

ReferenceURL : https://stackoverflow.com/questions/20842970/fix-curl-51-ssl-error-no-alternative-certificate-subject-name-matches

반응형