Golang으로 서버에서 PUBLIC KEY랑 CERTIFICATE 추출하기

rsa 이것저것 찾아보다가 블로그 공개키랑 인증서 가져오는거 찾아보고 여기 정리 해둠.

conf := &tls.Config{
    InsecureSkipVerify: true,
}

conn, err := tls.Dial("tcp", "linsoo.pe.kr:443", conf)
if err != nil {
    log.Println("Server doesn't support SSL certificate err: " + err.Error())
}
defer conn.Close()

원하는 URL에 연결함.

certs := conn.ConnectionState().PeerCertificates
for _, cert := range certs {
    fmt.Println("---------------------------------------------------")
    fmt.Println("Issuer Name: ", cert.Issuer)
    fmt.Println("Expiry: ", cert.NotAfter.Format("2006-January-02"))
    fmt.Println("Common Name: ", cert.Issuer.CommonName)

    //Public Key PEM 형식으로 추출
    asn1Bytes, err := x509.MarshalPKIXPublicKey(cert.PublicKey)
    if err != nil {
        log.Println(err)
    }
    var pemkey = &pem.Block{
        Type:  "PUBLIC KEY",
        Bytes: asn1Bytes,
    }
    fmt.Println(string(pem.EncodeToMemory(pemkey)))

    //이건 인증서를 PEM 형식으로 변환
    pemkey = &pem.Block{
        Type:  "CERTIFICATE",
        Bytes: cert.Raw,
    }
    fmt.Println(string(pem.EncodeToMemory(pemkey)))
}

코드 돌려보면 cert 가 3개로 나오는데 (인증서 마다 다를수 있음)

제 블로그 인증서 보면 R3->ISRG Root X1->DST Root CA X3 이렇게 3개 있는거가 순서대로 나옵니다. (배열첫번째가 R3)

제대로 받은건지 PEM 형식으로 변환해서 실제 서버에 인증서 파일 열어서 대조해보니 같게 나왔음.

 


Comments

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다