SSL을 운용을 하면 서버 및 클라이언트 간의 통신을 암호화 한다.
다만 암호화 전송을 하는 값을 가로 채서 암호환 된 값을 해석없이 그대로 재 전송 하여 이용할수 있는 해킹 기법을 막기 위해
홈페이지에 HTTP Strict Transport Security / HTTP Public Key Pinning 을 선언해야 한다.
https://ko.wikipedia.org/wiki/중간자_공격 에 대략적인 공격 방식에 대한 설명이 있다.
예시를 들어서 설명을 한다면..
- 공격자가 A은행 에서 B은행으로 돈을 보낸다.
- 이때 공격자는 A은행에서 B은행으로 전송하는 데이터를 스니핑한다.
- 공격자는 암호화된 데이터를 해석하지 않은채로 http 를 이용하여 B은행으로 재 전송을 한다.
- HSTS, HPKP 선언이없을경우 B은행의 서버는 정상전송값과 공격자 신호를 구분 없이 계좌에 돈이 쌓인다.
- 공격자는 돈을 인출하여 유유히 사라진다.
A. HSTS (HTTP Strict Transport Security)
HSTS 선언을 하는 경우 사이트는 HTTPS 로 강제 고정이 되기 때문에 외부 HTTP 를 연동하여 서비스 되는 부분이 있을경우
해당 연결이 끊어질 수 있다. 기본적으로 forced HTTPS 가 적용된 사이트에서는 HTTP 컨텐츠를 불러올 수 없다.
아울러 인증서가 만료되는경우 이 HSTS설정 때문에 접속이 아예 불가능할 수 있다.
HSTS 는 몇번 언급을 한적이 있는데 Header SET 을 통해 선언 하며 forced HTTPS 가 적용된 사이트는 속도상 이점이 생긴다. – 선언된 Header 에 의해서 접속한 도메인은 HTTPS 통신만 사용한다는 선언이다.
1 |
Header always set Strict-Transport-Security "max-age=15552000; preload" |
.htaccess 혹은 웹서버의 가상호스트 에 선언하면 된다.
B. HPKP (HTTP Public Key Pinning)
HPKP는 인증서의 pin을 공개함으로서 통신에 사용된 인증서가 pin과 비교함으로서 위조된 인증서를 구분할 수 있다.
즉 선언을 할때 pin 코드는 인증서에서 추출해야 함으로 인증서가 교체되는 경우 pin 역시 교체를 해야한다.
1 |
Header set Public-Key-Pins 'pin-sha256="DE7ntbANTouhht7vxZIhpHI9UVzGcSmWNDZumjS1yvU=";pin-sha256="CtK5iaXbFhoHDsmHvpVYENisllUsXOSfXLwrFXvNcq4=";max-age=2592000;includeSubDomains' |
첫번째 pin-sha256 의 경우 HTTPS 통신에 사용된 인증서의 pin 코드 이다.
두번째 pin-sha256는 서버에서 생성한 csr을 가지고 생성하는 코드 이며 백업 pin 코드 이다.
인증서(crt파일) 에서 pin 을 확인하는 방법이다.
1 |
~]# openssl x509 -noout -in 인증서파일.pem -pubkey|openssl pkey -pubin -outform der|openssl dgst -sha256 -binary|openssl enc -base64 |
CSR파일에서 pin 을 확인 하는 방법이다. (백업키 생성을 위해 쓴다.)
1 2 3 4 5 |
~]# openssl genrsa -out 임시KEY파일.key 4096 ~]# openssl req -new -key 임시KEY파일.key -sha256 -out 임시CSR파일.csr ...CSR 생성을 위한 입력값을 넣는다... ~]# openssl req -noout -in 임시CSR파일.csr -pubkey|openssl pkey -pubin -outform der|openssl dgst -sha256 -binary|openssl enc -base64 |
Let’s encrypt 를 이용했을때 약 2개월 단위로 인증서가 교체가 된다…. 즉 HPKP pin 역시 2개월 단위로 변경…을 해야 한다.
물론 백업키는 변경할 필요가 없겠지만…
이건 아무래도 귀찬기 때문에 스크립트 만들어야 겠다 ‘ㅅ’a