SSL 장애 분석을 위한 openssl 도구

현재 SSL 프로토콜은 광범위하게 운용되고 있는데 SSL 서버의 신분인증에 문제가 발생할 때 어떻게 해야만 효과적으로 신속하게 문제의 근원을 찾을 수 있습니까?이 글은 openssl이 제공하는 명령행 도구와 결합하여 s_client는 여러 가지 인증 실패 상황을 나열하고 문제 진단 방법을 제시했다.

SSL 악수 프로토콜


우선 SSL 프로토콜이 연결되는 과정을 간단하게 소개합니다.그림 1과 같이 다음과 같은 몇 가지 프로세스가 있습니다.
그림 1.SSL 인증 및 키 협상 절차
  • 클라이언트가 요청합니다. hello 메시지를 포함하고 클라이언트가 지원하는 암호 알고리즘과 SSL 프로토콜의 버전 메시지와 키 생성에 사용되는 무작위 수를 첨부합니다.
  • 서버가 메시지를 받은 후 서버 측은 암호화 압축 알고리즘을 선택하고 서버 측의 무작위 수를 생성하여 이 정보를 클라이언트에게 피드백한다.이어서 서버 측은 자신의 디지털 인증서(그림1에서 X.509 디지털 인증서를 사용)를 클라이언트에게 발송한다.이 작업을 완료하면 서버 측에서 클라이언트에게 "hello done"메시지를 보냅니다.또한 서버가 클라이언트에 대한 인증을 필요로 한다면 서버 측은 클라이언트 인증서를 요청하는 메시지를 보낼 것입니다.
  • 클라이언트가'hello done'를 받으면 서버 측의 디지털 인증서를 인증하고 서버 측에서 선택한 알고리즘이 가능한지 확인합니다.서버가 클라이언트 신분 인증을 요구하면 클라이언트는 자신의 키 인증서를 발송합니다.
  • 서버에 대한 인증이 통과되면 클라이언트가 키 교환을 요청합니다.
  • 서버 측과 클라이언트는 이전에 협상한 알고리즘과 교환 랜덤수에 따라 대칭 키를 생성하여 후속 통신을 한다.

  • 페이지 맨 위로 돌아가기

    s_client 소개


    openssl은 SSL 프로토콜의 오픈 소스 코드를 제공합니다. 세 가지 부분을 포함합니다. ssl 라이브러리, 복호화 라이브러리와 명령행 도구입니다.명령행 도구에서 s_client는 원격 서버에 SSL 프로토콜로 연결된 클라이언트 프로그램으로 이 도구는 테스트 진단에 사용할 수 있습니다.비록 s_클라이언트는 일부 기초 기능만 제공했지만 그 내부의 구체적인 실현에서 ssl 라이브러리의 대부분 인터페이스를 사용했다.s_client 명령줄의 구문은 다음과 같습니다.
    명세서 1.s_client 매개 변수
    openssl s_client [-connect host:port>] [-verify depth] [-cert filename] [-key filename] 
     [-CApath directory] [-CAfile filename][-reconnect] [-pause] [-showcerts] [-debug] [-msg] 
     [-nbio_test] [-state] [-nbio] [-crlf] [-ign_eof] [-quiet]

    일반적인 매개변수의 용도는 다음과 같습니다.
  • -connecthost:port: 원격 서버의 주소와 포트를 지정합니다. 이 인자가 없으면 기본값은localhost:443입니다.
  • -cert filename: 서버 측에서 클라이언트의 신분을 검증해야 한다면 -cert를 통해 클라이언트의 인증서 파일을 지정합니다.
  • -key filename: 개인 키 파일 지정;
  • -verify depth: 서버 인증서 검증을 열고 인증서 검증 과정의 최대 깊이를 정의합니다.
  • -showcerts: 서버 인증서 체인 보이기;
  • -Cafile filename: 서버 인증서를 검증하는 루트 인증서를 지정합니다.
  • -state: SSL 세션의 상태를 인쇄합니다.

  • 페이지 맨 위로 돌아가기

    s_클라이언트 SSL 악수 프로토콜에서의 응용


    SSL 서버에 연결할 때 가장 흔히 볼 수 있는 문제는 클라이언트가 서버 측의 신분을 인증하는 데 실패하는 것이다. 여러 가지 원인으로 인해 이러한 실패가 발생한다. 다음은 흔히 볼 수 있는 오류를 열거하고 s_를 어떻게 응용하는지 분석했다.클라이언트가 확진을 진행하다.
  • 서버의 인증서가 전송 과정에서 변경됨
  • 서버 인증서 추출:
  • linux 플랫폼에서 스크립트retrieve-cert.sh를 만들고 목록 2의 내용을 저장합니다.이 스크립트의 출력 내용은 서버 측의 X509 인증서가 Base64 인코딩을 거친 내용입니다. 스크립트를 실행하고 스크립트 출력을 파일 서버에 저장합니다.pem 중.
    명세서 2.인증서 추출
    ###usage: retrieve-cert.sh remote.host.name [port] 
     SSLHOST=$1 
     SSLPORT=${2:-443} 
     echo |\ 
     openssl s_client -connect ${SSLHOST}:${SSLPORT} 2>&1 |\ 
     sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'
  • 획득한 인증서를 검증하고 명령줄에서 실행합니다openss verify server.pem.

  • 인증서 내용이 변경되면 실행 결과는 목록 4와 같습니다.
    명세서인증서 인증 실패
    [root@wks547385wss openssl]# openssl verify server.pem 
     unable to load certificate 
     19280:error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag:tasn_dec.c:947: 
     19280:error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 
     error:tasn_dec.c:304:Type=X509 
     19280:error:0906700D:PEM routines:PEM_ASN1_read_bio:ASN1 lib:pem_oth.c:82:

    그렇지 않으면 우리는 인증 통과를 받을 수 있다. 결과는 다음과 같다.
    명세서인증서 인증 성공
    [root@wks547385wss openssl]# openssl verify server.pem 
     server.pem: OK
  • 클라이언트가 인증 서버 측의 인증서를 저장하지 않은 루트 인증서;

  • 1. 파라미터-state를 사용하여 악수 프로토콜의 인증서 인증 실패 여부를 확인합니다.
    명세서SSL 악수 프로토콜 상태 표시
    [root@wks547385wss openssl]# openssl s_client  -connect www6.software.ibm.com:443 -state 
     CONNECTED(00000003) 
     SSL_connect:before/connect initialization 
     SSL_connect:SSLv2/v3 write client hello A 
     SSL_connect:SSLv3 read server hello A 
     depth=1 /C=US/O=Equifax/OU=Equifax Secure Certificate Authority 
     verify error:num=19:self signed certificate in certificate chain 
     verify return:0 
     SSL_connect:SSLv3 read server certificate A 
     SSL_connect:SSLv3 read server done A 
     SSL_connect:SSLv3 write client key exchange A 
     SSL_connect:SSLv3 write change cipher spec A 
     SSL_connect:SSLv3 write finished A 
     SSL_connect:SSLv3 flush data 
     SSL_connect:SSLv3 read finished A

    2. 운용s_client 매개 변수-showcerts는 서버 측의 루트 인증서를 가져옵니다. 서버 측의 인증서 체인은 모두 표시됩니다. 인증서 체인의 끝에 루트 인증서가 있습니다. 인증서 파일을 저장하는 것은 serverCA.pem 。명세서서버 측의 루트 인증서 가져오기
    [root@wkswss openssl]# openssl s_client -connect www6.software.ibm.com:443 – showcerts 
    …
     s:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority 
     i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority 
     -----BEGIN CERTIFICATE----- 
     MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV 
     UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy 
     dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1 
     MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx 
     dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B 
     AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f 
     BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A 
     cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC 
     AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ 
     MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm 
     aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw 
     ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj 
     IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF 
     MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA 
     A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y 
     7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh 
     1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 
     -----END CERTIFICATE-----

    3. s_ 활용client 매개 변수-CAfile CA.pem 서버 다시 연결
    명세서서버 인증서 파일의 SSL 연결 설정
    [root@wkswss openssl]# openssl s_client -CAfile serverCA.pem -connect 
     www6.software.ibm.com:443 -state 
     CONNECTED(00000003) 
     SSL_connect:before/connect initialization 
     SSL_connect:SSLv2/v3 write client hello A 
     SSL_connect:SSLv3 read server hello A 
     depth=1 /C=US/O=Equifax/OU=Equifax Secure Certificate Authority 
     verify return:1 
     depth=0 /C=US/O=IBM/CN=www6.software.ibm.com 
     verify return:1 
     SSL_connect:SSLv3 read server certificate A 
     SSL_connect:SSLv3 read server done A 
     SSL_connect:SSLv3 write client key exchange A 
     SSL_connect:SSLv3 write change cipher spec A 
     SSL_connect:SSLv3 write finished A 
     SSL_connect:SSLv3 flush data 
     SSL_connect:SSLv3 read finished A 
    ……
     SSL-Session: 
        Protocol  : TLSv1 
        Cipher    : DES-CBC3-SHA 
        Session-ID: 00365044871540E334826923BF9C531CE659274858585858499C14380000000C 
        Session-ID-ctx: 
        Master-Key: 
     D065F1F2297560F1CD4CCC0D7A58E647CC9F596BCEC545CF90DD54659CB36C53CDAC977E5784C6 
     A273BA28B486E578B9 
        Key-Arg   : None 
        Krb5 Principal: None 
        Start Time: 1234986898 
        Timeout   : 300 (sec) 
        Verify return code: 0 (ok)
  • 클라이언트는 인증된 서버 인증서의 루트 인증서를 가지고 있지만 서버는 방화벽에 의해 격리되고 방화벽은 클라이언트로부터 SSL 연결 요청을 받았을 때 방화벽의 인증서를 되돌려줍니다.이런 상황의 증상은 서버 인증서가 왜곡된 것과 매우 비슷하지만, 상술한 언급 방법을 응용해도 잘못된 위치를 정할 수 없다는 차이점이 있다.

  • 1. 클라이언트는 이미 서버 빌드를 가지고 있습니다.rchland.ibm.com의 루트 인증서rochCA.pem는 클라이언트가 서버 고객을 연결하려고 할 때 서버에 대한 인증서를 통과할 수 없습니다.
    명세서인증 실패
    [root@wks547385wss openssl]# openssl s_client -CAfile roch.pem -state -connect 
     build.rchland.ibm.com:443 
     CONNECTED(00000003) 
     SSL_connect:before/connect initialization 
     SSL_connect:SSLv2/v3 write client hello A 
     SSL_connect:SSLv3 read server hello A 
     depth=0 /serialNumber=93e352/CN=rch-fw-1a.rchland.ibm.com/unstructuredName= 
     rch-fw-1a.rchland.ibm.com 
     verify error:num=18:self signed certificate 
     verify return:1 
     depth=0 /serialNumber=93e352/CN=rch-fw-1a.rchland.ibm.com/unstructuredName= 
     rch-fw-1a.rchland.ibm.com 
     verify return:1 
     SSL_connect:SSLv3 read server certificate A 
     SSL_connect:SSLv3 read server done A 
     SSL_connect:SSLv3 write client key exchange A 
     SSL_connect:SSLv3 write change cipher spec A 
     SSL_connect:SSLv3 write finished A 
     SSL_connect:SSLv3 flush data 
     SSL_connect:SSLv3 read finished A 
    …

    2. x509 도구를 사용하여 루트 인증서의 구체적인 내용, 특히 인증서 발급자와 소지자의 신분을 확인한다. 명세서 10과 같다.
    명세서루트 인증서 디코딩
    [root@wks547385wss openssl]# openssl x509 -text -in roch.pem 
     Certificate: 
        Data: 
            Version: 3 (0x2) 
            Serial Number: 903804111 (0x35def4cf) 
            Signature Algorithm: sha1WithRSAEncryption 
            Issuer: C=US, O=Equifax, OU=Equifax Secure Certificate Authority 
            Validity 
                Not Before: Aug 22 16:41:51 1998 GMT 
                Not After : Aug 22 16:41:51 2018 GMT 
            Subject: C=US, O=Equifax, OU=Equifax Secure Certificate Authority 
            Subject Public Key Info: 
                Public Key Algorithm: rsaEncryption 
                RSA Public Key: (1024 bit)

    상술한 인증서 발급자 정보가 있으면 우리의 문제는 쉽게 해결됩니다. 클라이언트는 방화벽에서 온 인증서를 받았습니다. 이 인증서와 방화벽 뒤에 있는 서버의 디지털 인증서는 서로 다른 발급자에서 왔습니다.

    좋은 웹페이지 즐겨찾기