ssl
TLS(SSL)
netty에서 테스트용 TLS,SSL을 사용하기 위하여 테스트 인증서 및 개인키를 생성하는 SelfSignedCertificate 클래스를 제공한다. 그러나, 운영모드에서는 사용할 수는 없다. 실제 운영에서는 인증서를 구입해서 사용해야 하나, openssl로 인증서 및 개인키를 생성하여 적용해보자.
open ssl 설치(윈도우)
http://slproweb.com/products/Win32OpenSSL.html Win64 OpenSSL v1.1.0b 다운로드 후 install
인증서 생성
TLS(SSL)
netty에서 테스트용 TLS,SSL을 사용하기 위하여 테스트 인증서 및 개인키를 생성하는 SelfSignedCertificate 클래스를 제공한다. 그러나, 운영모드에서는 사용할 수는 없다. 실제 운영에서는 인증서를 구입해서 사용해야 하나, openssl로 인증서 및 개인키를 생성하여 적용해보자.
open ssl 설치(윈도우)
Win64 OpenSSL v1.1.0b 다운로드 후 install
인증서 생성
개인키 생성
privatekey.pem 파일 생성
openssl genrsa -aes256 -out privatekey.pem 2048
암호입력(2번) tkfkdgo123!
CSR 파일 생성 (nene.csr 파일 생성)
openssl req -new -key privatekey.pem -out nene.csr
아래와 같이 기관정보 입력 (불어?) Nom du pays (code ISO a 2 lettres) [FR]:kr Nom du departement [Alpes Maritimes]:seoul Nom de la ville [Nice]:seoul Raison Sociale (nom officiel de l organisation) [Michel Durand SA]:ppark Nom commercial, service, ou texte libre (optionnel) [Fourni par TBS internet]:nene Adresse du site a securiser (FQDN de votre site) [www.monsitessl.fr]:nene.ppark.com
전자서명 (nene.crt 생성)
openssl x509 -in nene.csr -out nene.crt -req -signkey privatekey.pem -days 365
C:\OpenSSL-Win64>openssl x509 -in nene.csr -out nene.crt -req -signkey privatekey.pem -days 365 Signature ok subject=/C=kr/ST=seoul/L=seoul/O=ppark/OU=nene/CN=nene.ppark.com Getting Private key Enter pass phrase for privatekey.pem: <암호입력>
참고 : -days 365 는 1년짜리 인증서를 생성
검증
4.1 인증서 검증
openssl x509 -noout -text -in ./nene.crt
결과
C:\OpenSSL-Win64>openssl x509 -noout -text -in ./nene.crt
Certificate:
Data:
Version: 1 (0x0)
Serial Number:
9c:86:ca:23:7d:4d:25:d7
Signature Algorithm: sha256WithRSAEncryption (sha256:해시함수, RSA:공개키알고리즘)
Issuer: C=kr, ST=seoul, L=seoul, O=ppark, OU=nene, CN=nene.ppark.com (기관정보)
Validity
Not Before: Oct 9 04:23:05 2016 GMT (인증서 시작일자)
Not After : Oct 9 04:23:05 2017 GMT (인증서 만료일자)
Subject: C=kr, ST=seoul, L=seoul, O=ppark, OU=nene, CN=nene.ppark.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
생략
Exponent: 65537 (0x10001)
Signature Algorithm: sha256WithRSAEncryption
생략
4.2 개인키 검증
openssl rsa -noout -text -in privatekey.pem
결과
Enter pass phrase for privatekey.pem: <암호입력>
Private-Key: (2048 bit)
개인키 형식 변경
netty에서 사용하기 위하여 개인키 형식(form)을 변경해야한다.
오류 발생 java.security.KeyException: could not find a PKCS #8 private key in input stream (see http://netty.io/wiki/sslcontextbuilder-and-private-key.html for more information)
개인키 형식을 기존 ASN.1에서 PKCS#8형식으로 변경하자. 기존 privatekey.pem을 백업하고 명령어 실행
openssl pkcs8 -topk8 -inform PEM -outform PEM -in privatekey.pem -out nene.pem 기존암호 입력하고 새로운 암호2회 입력함
문제해결
윈도우에서 아래와 같은 메시지 발생 Can't open config file: /usr/local/ssl/openssl.cnf
- openssl.cnf 파일을 다운받아 복사함
- 명령실행
set OPENSSL_CONF=c:\OpenSSL-Win64\openssl.cnf
브라우저에서 인증서 확인하기
https://localhost:6443/ 로 접근하면 경고 메시지를 확인할 수 있다. 브라우저는 신뢰된 인증기관의 공개키를 가지고 인증서의 진위여부를 검증하는데 서버가 전송한 인증서의 전자서명이 신뢰된 인증기관에서 발행한 것이 아니기 때문이다. (openssl을 사용해서 신뢰된 인증기관이 아닌 개인키로 서명(self signed)한 인증서를 사용했다)
패킷 캡처를 통한 확인
와이어 샤크 다운로드
WinPcap(윈도우 패킷캡처 드라이버) 설치 옵션을 활성화해서 설치하자!
필터란에 tcp.port == 6443 하면 쏟아지는 패킷들...
netty 적용
- VM arguments에 -Dssl 옵션을 추가하면 ssl 이 적용되도록 함
- 주의 -Dssl=true, -Dssl=false 와 같이 값을 적용하지 않고 -Dssl 옵션으로만 적용함
- 즉, -Dssl=false라고 해도 true로 인식
- SslContext 객체를 통한 서버 및 클라이언트 ssl handler 생성 후 채널 파이프라인에 추가함
서버측 주요 코드(nenes)
//resources/cert 이하 인증서와 개인키 파일을 로드하여 컨텍스트 생성
final File cert = ResourceUtils.getFile("classpath:/cert/nene.crt"); //인증서 로드
final File privateKey= ResourceUtils.getFile("classpath:/cert/nene.pem"); // 개인키 로드, pkcs#8 form
SslContext sslCtx = SslContextBuilder.forServer(cert, privateKey, "tkfkdgo123!").build(); //인증서, 개인키, password
//채널 파이프라인에 추가함
p.addLast(sslCtx.newHandler(ch.alloc()));
클라이언트측 주요 코드(nenea)
// 인증서 검증 없음. 모든 x.509인증서를 신뢰함
SslContext sslCtx = SslContextBuilder.forClient().trustManager(InsecureTrustManagerFactory.INSTANCE).build();
//채컬 파이프라인에 추가함
p.addLast(sslCtx.newHandler(ch.alloc(), HOST, PORT));