다음과 같이 테스트 목적으로 localhost에 대한 자체 서명된 인증서를 만들었습니다.
openssl genrsa -out key.pem 2048
openssl req -new -key key.pem -out certificate.csr
openssl x509 -req -in certificate.csr -signkey key.pem -out certificate.pem
FQDN에 "localhost"를 지정했습니다. 그게 다입니다. 저는 다른 작업을 수행하거나 아무데도 복사하지 않았습니다. 3개의 파일이 모두 제 애플리케이션 디렉토리에 있습니다.
localhost에서 apache나 nginx가 아닌 웹 서버를 실행하면 다음 오류가 발생합니다.
$ curl -v https://localhost:3345
* Rebuilt URL to: https://localhost:3345/
* Trying ::1...
* connect to ::1 port 3345 failed: Connection refused
* Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 3345 (#0)
* ALPN, offering http/1.1
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
* successfully set certificate verify locations:
* CAfile: /etc/ssl/certs/ca-certificates.crt
CApath: none
* TLSv1.2 (OUT), TLS header, Certificate Status (22):
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (OUT), TLS alert, Server hello (2):
* SSL certificate problem: self signed certificate
* Closing connection 0
* TLSv1.2 (OUT), TLS alert, Client hello (1):
curl: (60) SSL certificate problem: self signed certificate
More details here: https://curl.haxx.se/docs/sslcerts.html
curl performs SSL certificate verification by default, using a "bundle"
of Certificate Authority (CA) public keys (CA certs). If the default
bundle file isn't adequate, you can specify an alternate file
using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
the bundle, the certificate verification probably failed due to a
problem with the certificate (it might be expired, or the name might
not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
the -k (or --insecure) option.
이것이 중요한 경우 내 코드는 다음과 같습니다.
startApp = do
let port = 3345
print $ "Listening the port " ++ (show port) ++ " ..."
let tls = tlsSettings "certificate.pem" "key.pem"
runTLS tls (setPort port defaultSettings) app
보시다시피 저는 "csr"과 포트 3345 대신 "pem"과 "pem"을 사용하고 있습니다.
저는 Arch를 사용하고 있지만 Ubuntu용 솔루션도 필요합니다.
이 오류를 어떻게 해결할 수 있나요?
브라우저에서도 오류가 발생합니다. 특히 FF에서는:
The owner of localhost has configured their website improperly. To protect your information from being stolen, Firefox has not connected to this website.
답변1
기본적으로 Curl은 시스템의 신뢰 저장소를 사용하여 인증서 체인의 신뢰를 결정합니다. 이 신뢰 저장소에는 신뢰할 수 있는 CA 인증서 목록이 포함되어 있습니다. 자체 서명했고 신뢰 저장소의 CA 인증서에 대한 체인을 사용하지 않기 때문에 컬은 체인을 신뢰하지 않기 때문에 요청이 실패합니다.
누구나:
- 자체 서명이 아닌 신뢰할 수 있는 인증 기관에서 CSR에 서명하십시오(암호화하자연결된 루트 인증서로 인해 거의 모든 신뢰 저장소에서 무료이며 신뢰할 수 있습니다.
- 시스템 신뢰 저장소에 인증서를 추가하거나
--cacert <your cert>
이 인증서만 신뢰 하거나- 사용
curl -k
(검증이 수행되지 않으므로 권장되지 않음)