certs=(X509Certificate[])request.getAttribute("javax.servlet.request.X509Certificate");
这段永远都是null不知道是哪里问题?nginx?还是tomcat?
网上搜索了不少信息,但是都没有解决,有人直接用tomcat来当https服务器是可以解决,但是我真不想那么做
nginx用http和https打开tomcat的页面都正确了,并且也弹出了证书选择的对话框,但是服务端就是不能获取客户端的认证证书信息
这段是NGINX的配置文件的
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
}
upstream tomcat {
server 192.168.2.114:8080 fail_timeout=0;
}
# HTTPS server
#
server {
listen 443 ssl;
server_name localhost;
ssl_certificate d:/ssl/server.crt;
ssl_certificate_key d:/ssl/server.key;
ssl_client_certificate d:/ssl/ca.crt;
ssl on;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_verify_client on;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
# note, there is not SSL here! plain HTTP is used
client_max_body_size 16m;
client_body_buffer_size 128k;
proxy_pass http://tomcat/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_next_upstream off;
proxy_connect_timeout 30;
proxy_read_timeout 300;
proxy_send_timeout 300;
}
}
}
这段是tomcat的
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
scheme="https"
proxyName="192.168.2.114"
proxyPort="443" />
<Valve className="org.apache.catalina.valves.RemoteIpValve"
remoteIpHeader="x-forwarded-for"
remoteIpProxiesHeader="x-forwarded-by"
protocolHeader="x-forwarded-proto"/>
증명서발송 검색해보니 이런 글이 있는 것 같은데, 아직 확인되지 않은 내용이라 이 문제를 해결할 수도 있을 것 같습니다
인증서 계층
서버 구조
Tomcat은 클라이언트 인증이 필요하지 않지만, nginx는 클라이언트 인증이 필요합니다
Tomcat 구성 주의 사항
Tomcat 서버 인증서의 CN은 tomcat_backend여야 합니다
nginx 구성 주의 사항
openssl을 사용하여 pfx 파일에서 pem 형식 공개 키 내보내기
openssl pkcs12 -clcerts -nokeys -in cert.p12 -out cert.pem
openssl을 사용하여 pfx 파일에서 pem 형식 개인 키 내보내기
openssl pkcs12 -nocerts -nodes -in cert.p12 -out private.pem
openssl을 사용하여 CA 인증서 체인 생성
루트 CA와 중간 CA의 공개 키 인증서를 내보냅니다. 예를 들어 내보낸 후의 파일 이름은 root.pem ca.pem입니다.
root.pem ca.pem을 하나의 파일로 병합합니다. 앞쪽에는 ca.pem, 뒤쪽에는 root.pem이 있습니다
cat ca.pem >> chain.pem
으아악cat root.pem >> chain.pem
nginx 서버 세그먼트 구성
http 헤더를 통해 클라이언트 인증서를 백엔드 tomcat에 전달합니다. Proxy.conf 파일에서 구성
으아악CA 인증서, 클라이언트 인증서, 서버 인증서를 생성하는 방법에 대한 자세한 내용은 "JEE 프로젝트에서 SSL 양방향 인증 구현"을 참조하세요.
JEE 프로젝트에서 SSL 양방향 인증 구현