찾다

 >  Q&A  >  본문

java - nginx+tomcat+双向SSL认证,jsp文件一直不能获取客户端证书信息

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"/>
ringa_leeringa_lee2802일 전1238

모든 응답(2)나는 대답할 것이다

  • 迷茫

    迷茫2017-04-18 10:35:21

    증명서발송 검색해보니 이런 글이 있는 것 같은데, 아직 확인되지 않은 내용이라 이 문제를 해결할 수도 있을 것 같습니다

    1. 인증서 계층

    1. 서버 구조

    Tomcat은 클라이언트 인증이 필요하지 않지만, nginx는 클라이언트 인증이 필요합니다

    1. Tomcat 구성 주의 사항

    Tomcat 서버 인증서의 CN은 tomcat_backend여야 합니다

    1. 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 양방향 인증 구현"을 참조하세요.

    회신하다
    0
  • PHPz

    PHPz2017-04-18 10:35:21

    JEE 프로젝트에서 SSL 양방향 인증 구현

    회신하다
    0
  • 취소회신하다