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


88

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

답변:


113

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

해결책은 호스트에 연락하여 인증서 수정을 요청하는 것입니다.
그렇지 않으면 cURL의 인증서 확인을 끄고 -k(또는 --insecure) 옵션을 사용할 수 있습니다.
옵션에서 언급 했듯이 안전하지 않습니다 . 이 옵션은 man-in-the-middle 공격을 허용하고 HTTPS의 목적을 무효화하므로 사용해서는 안됩니다.

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


10
수표를 끄라는 대답은 결과가 무엇인지 강조해야합니다. 위험 해요!
DrP3pp3r

1
내가 생각한 것은 인증서의 주제 이름이 *.my-domain.com적용되지 않은 것 dev.subdomain.my-domain.com입니다. 그러나 dev-subdomain.my-domain.com. 따라서 여러 하위 도메인 작업을 수행하려면이 기사의 내용이 필요할 수 있습니다.- sslshopper.com

77

편집자 주 : 사용하기에 충분히 오래된 PHP 버전을 사용하는 경우 이는 매우 위험한 접근 방식입니다. 중간자 (man-in-the-middle) 공격에 대한 코드를 열고 암호화 된 연결의 주요 목적 중 하나를 제거합니다. 이 기능은 매우 위험하기 때문에 최신 버전의 PHP에서 제거되었습니다. 이것이 70 번 찬성 된 유일한 이유는 사람들이 게으 르기 때문입니다. 이렇게하지 마십시오.


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

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

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

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


30
글쎄, 이것은 내가 PHP에서 겪었던 문제에 대한 Google 검색에서 나왔으므로 도움이되었습니다.
Gujamin

1
나는 똑같은 검색을했고 여기에 당신의 대답을 갖게되어 기쁩니다. 감사!
CptMisery

2
CURLOPT_SSL_VERIFYHOST제 경우에는 충분했습니다
1234ru

아직 인증서가없는 경우 테스트 목적으로 유용합니다.
Andrew

20

인증서의 일반 이름 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를 사용하는 이유를 스스로에게 물어봐야합니다.


4

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

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 번들에 대한 경로를 제공하려면 문자열로 설정하십시오.

0

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

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

RFC 2818은 "dNSName 유형의 subjectAltName 확장이 존재하는 경우 ID로 사용해야합니다. 그렇지 않으면 인증서의 Subject 필드에있는 (가장 구체적인) Common Name 필드를 사용해야합니다. 이름은 기존 관행이며 더 이상 사용되지 않으며 인증 기관은 대신 dNSName을 사용하는 것이 좋습니다. "


0

나는 같은 문제가 있었다. 제 경우에는 digitalocean과 nginx를 사용했습니다.
먼저 digitalocean에서 도메인 example.app과 하위 도메인 dev.exemple.app을 설정했습니다. 둘째, godaddy에서 두 개의 SSL 인증서를 구입했습니다. 마지막으로 nginx에서 두 개의 도메인을 구성하여 다음 스 니펫과 함께 두 개의 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

내 실수는 아래 두 줄

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

나는 이것을 다음과 같이 변경해야했습니다.

     listen 443 ssl;
     listen [::]:443 ssl;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.