240.5.3. Request-Reply 통신을 사용하는 SSL/TCP 기반 Netty 소비자 엔드포인트
240.5.3. Request-Reply 통신을 사용하는 SSL/TCP 기반 Netty 소비자 엔드포인트
JSSE 구성 유틸리티 사용
Camel 2.9부터 Netty 구성 요소는 Camel JSSE 구성 유틸리티를 통해 SSL/TLS 구성을 지원합니다. 이 유틸리티는 작성하는 데 필요한 구성 요소별 코드의 양을 크게 줄이고 엔드포인트 및 구성 요소 수준에서 구성할 수 있습니다. 다음 예제에서는 Netty 구성 요소에서 유틸리티를 사용하는 방법을 보여줍니다.
구성 요소의 프로그래밍 구성
KeyStoreParameters ksp = new KeyStoreParameters();
ksp.setResource("/users/home/server/keystore.jks");
ksp.setPassword("keystorePassword");
KeyManagersParameters kmp = new KeyManagersParameters();
kmp.setKeyStore(ksp);
kmp.setKeyPassword("keyPassword");
SSLContextParameters scp = new SSLContextParameters();
scp.setKeyManagers(kmp);
NettyComponent nettyComponent = getContext().getComponent("netty4", NettyComponent.class);
nettyComponent.setSslContextParameters(scp);
KeyStoreParameters ksp = new KeyStoreParameters();
ksp.setResource("/users/home/server/keystore.jks");
ksp.setPassword("keystorePassword");
KeyManagersParameters kmp = new KeyManagersParameters();
kmp.setKeyStore(ksp);
kmp.setKeyPassword("keyPassword");
SSLContextParameters scp = new SSLContextParameters();
scp.setKeyManagers(kmp);
NettyComponent nettyComponent = getContext().getComponent("netty4", NettyComponent.class);
nettyComponent.setSslContextParameters(scp);
Copy to ClipboardCopied!Toggle word wrapToggle overflow
Copy to ClipboardCopied!Toggle word wrapToggle overflow
[Netty4-UsingBasicSSL/TLSconfigurationontheJetty Component] Using Basic SSL/TLS configuration on the Jetty Component
JndiRegistry registry = new JndiRegistry(createJndiContext());
registry.bind("password", "changeit");
registry.bind("ksf", new File("src/test/resources/keystore.jks"));
registry.bind("tsf", new File("src/test/resources/keystore.jks"));
context.createRegistry(registry);
context.addRoutes(new RouteBuilder() {
public void configure() {
String netty_ssl_endpoint =
"netty4:tcp://localhost:5150?sync=true&ssl=true&passphrase=#password"
+ "&keyStoreFile=#ksf&trustStoreFile=#tsf";
String return_string =
"When You Go Home, Tell Them Of Us And Say,"
+ "For Your Tomorrow, We Gave Our Today.";
from(netty_ssl_endpoint)
.process(new Processor() {
public void process(Exchange exchange) throws Exception {
exchange.getOut().setBody(return_string);
}
}
}
});
JndiRegistry registry = new JndiRegistry(createJndiContext());
registry.bind("password", "changeit");
registry.bind("ksf", new File("src/test/resources/keystore.jks"));
registry.bind("tsf", new File("src/test/resources/keystore.jks"));
context.createRegistry(registry);
context.addRoutes(new RouteBuilder() {
public void configure() {
String netty_ssl_endpoint =
"netty4:tcp://localhost:5150?sync=true&ssl=true&passphrase=#password"
+ "&keyStoreFile=#ksf&trustStoreFile=#tsf";
String return_string =
"When You Go Home, Tell Them Of Us And Say,"
+ "For Your Tomorrow, We Gave Our Today.";
from(netty_ssl_endpoint)
.process(new Processor() {
public void process(Exchange exchange) throws Exception {
exchange.getOut().setBody(return_string);
}
}
}
});
Copy to ClipboardCopied!Toggle word wrapToggle overflow
SSLSession 및 클라이언트 인증서에 대한 액세스 얻기
클라이언트 인증서에 대한 세부 정보가 필요한 경우 javax.net.ssl.SSLSession 에 대한 액세스 권한을 얻을 수 있습니다. ssl=true 인 경우 Netty4 구성 요소는 다음과 같이 Camel Message의 헤더로 SSLSession 를 저장합니다.
SSLSession session = exchange.getIn().getHeader(NettyConstants.NETTY_SSL_SESSION, SSLSession.class);
// get the first certificate which is client certificate
javax.security.cert.X509Certificate cert = session.getPeerCertificateChain()[0];
Principal principal = cert.getSubjectDN();
SSLSession session = exchange.getIn().getHeader(NettyConstants.NETTY_SSL_SESSION, SSLSession.class);
// get the first certificate which is client certificate
javax.security.cert.X509Certificate cert = session.getPeerCertificateChain()[0];
Principal principal = cert.getSubjectDN();
Copy to ClipboardCopied!Toggle word wrapToggle overflow
클라이언트를 인증하기 위해 needClientAuth=true 를 설정해야 합니다. 그렇지 않으면 SSLSession 에서 클라이언트 인증서에 대한 정보에 액세스할 수 없으며 예외 javax.net.ssl.SSLPeerUnverifiedException: 피어가 인증되지 않은 피어 를 가져올 수 있습니다. 클라이언트 인증서가 만료되었거나 유효하지 않은 경우 이 예외를 가져올 수도 있습니다.
작은 정보
sslClientCertHeaders 옵션을 true 로 설정하면 Camel Message를 클라이언트 인증서에 대한 세부 정보가 포함된 헤더로 보강할 수 있습니다. 예를 들어, CamelNettySSLClientCertSubjectName 헤더에서 주체 이름을 쉽게 사용할 수 있습니다.