작업실

HPKP HTTP Public Key Pinning 적용 방법

우성군 5 6148 0

 

 

1. HPKP(HTTP Public Key Pinning) 의미

 

공격자들이 인증서를 훔치거나 위조해 사용자가 자기도 모르게 악성 사이트에 접속하고도 그 사실을 인지 못하게 하는 공격을 자주 했는데 퍼블릭 키 피닝을 사용하면 공인 인증서 발급 기관과 특정 도메인을 하나로 엮어주기 때문에 인증서를 위조하는 것만으로는 중간자 공격이 어려워집니다 

 

 

2. 웹사이트에서 뽑아내기

 

 

https://report-uri.io/home/pkp_hash 

 

위 링크로 들어가서 https를 포함한 도메인주소를 넣으면 알아서 뽑아줍니다. 해당 키를 입력하면 됩니다. (빨리 뽑아냄)

 

 

 

 

https://www.htbridge.com/ssl/ 

 

위 링크에서 SSL 검사를 하면 하이브리드 인증서를 모두 포함하여 뽑아줍니다. 해당 PIN 키를 뽑아내면 됩니다. (시간 1분~10분 정도 소요)

 

 

3. 수동으로 풀체인인증서에서 뽑아내기 

 

letsencrypt 인증서의 경우

자동생성 경로 /etc/letsencrypt/live/path/fullchain.pem

수동생성 경로 /0001_chain.pem

 

openssl x509 -pubkey < fullchain.pem | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64

 

 

예시 : OvFoldzJWiJwzn/H2xuN6IXm09PKvI5b+WVxBNjm6cc=

 

위 지문의 경우 인증서를 갱신하거나 바꿀 경우 항상 바뀌기 때문에, 변화가 있을 때마다 새로 뽑아서 입력해줘야 합니다.

 

다만 백업키는 서버에서 뽑아내기 때문에 그대로 두면 됩니다.

 

 

4. 첫번째 백업키 만들기

 

openssl genrsa -out wsgvet.first.key 4096

 

 

5. 첫번째 키로부터 csr 뽑아내기

 

openssl req -new -key wsgvet.first.key -sha256 -out wsgvet.first.csr

 

 

6. csr에서 base64 지문 뽑아내기

 

openssl req -pubkey < wsgvet.first.csr | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64

 

 

예시 : 5iOFgnVG72sf37y63FKa4ZtxEaKs9tDXUKUo76OFLkM=

 

 

7. 위 과정을 이름만 다르게 해서 다시 뽑아내기

 

openssl genrsa -out wsgvet.second.key 4096

 

 

openssl req -new -key wsgvet.second.key -sha256 -out wsgvet.second.csr

 

 

openssl req -pubkey < wsgvet.second.csr | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64

 

 

예시 : F2rirJiUb68IAj3au6rSvmK2Fh3oAlaDM3ujMt9tLQQ=

 

 

8. 서버 설정에 추가하기 (Nginx 기준)

 

위에서 뽑은 3가지 지문을 순서대로 넣으면 됩니다.

 

add_header Public-Key-Pins 'pin-sha256="OvFoldzJWiJwzn/H2xuN6IXm09PKvI5b+WVxBNjm6cc="; pin-sha256="5iOFgnVG72sf37y63FKa4ZtxEaKs9tDXUKUo76OFLkM="; pin-sha256="F2rirJiUb68IAj3au6rSvmK2Fh3oAlaDM3ujMt9tLQQ="; max-age=2592000; includeSubDomains';

 

 

9. 검증하기

 

1) https://report-uri.io/home/pkp_analyse   

 

위 링크에서 확인하면 됩니다. 

 

 

2) https://www.htbridge.com/ssl/ 

 

위 링크에서 확인하면 됩니다.

 

 

3) https://www.ssllabs.com/ssltest/

 

위 링크에서 확인하면 됩니다.

 

 

4) putty에서 패키지 설치 후 확인

 

우분투 기준으로 testssl을 설치합니다.

 

apt-get install testssl

 

 

testssl -H www.wsgvet.com 

 

 

위와 같은 형식으로 명령어를 넣으면

 

--> Testing HTTP header response @ "/"

 

 HTTP Status Code             200 OK

 HTTP clock skew              0 sec from localtime

 Strict Transport Security    365 days=31536000 s, includeSubDomains, preload

 Public Key Pinning           # of keys: 3, 30 days=2592000 s, includeSubDomains

                              matching host key: OvFoldzJWiJwzn/H2xuN6IXm09PKvI5b+WVxBNjm6cc

 Server banner                WSGVET's NAS

 Application banner           --

 Cookie(s)                    2 issued: 1/2 secure, 1/2 HttpOnly

 Security headers             X-Frame-Options: SAMEORIGIN

                              X-XSS-Protection: 1; mode=block

                              X-Content-Type-Options: nosniff

 Reverse Proxy banner         --

위에 빨간글자인 matching host key 라고 나와야 됩니다.

 

HPKP 적용이 완료되었습니다!

, , , ,

5 Comments
닭비둘기 2016.11.07 19:35  
안녕하세요.
다름이 아니라 my cloud 에서도 https 리다이렉팅이랑 위 방법대로 ssl 인증을 받을 수 있나요?
우성군 2016.11.07 19:56  
[@닭비둘기] My Cloud는 아파치로 구동되므로 위 내용에 있는 Nginx 설정을 사용할 수 없습니다.

그리고 SSL 인증이 될지는 저도 가늠이 되지 않습니다.

다만 V03 버전에서는 가능할 수도 있습니다.
닭비둘기 2016.11.09 19:35  
[@우성군] 오호.. 답변 감사합니다~
죄송하지만 다시한번 질문하겠습니다 ㅠㅠ
V04에서 https 리다이렉팅은 가능할까요?
우성군 2016.11.09 19:36  
[@닭비둘기] 아파치 설정만 수정하면 가능할 것  같네요.

다만 아파치는 제가 써보질 않아 구글링 해보셔야 될겁니다.
닭비둘기 2016.11.11 16:27  
[@우성군] 답변 감사합니다