Friday September 18, 2009 Enabling Client Certificate Authentication in Sun Web Server 7.0 reverse proxy server and origin server
For this I have setup two Sun Java System Web Server 7.0 update 6 instances. One acting as a reverse proxy and the other origin server that serves the request. Enabled SSL and client authentication on both these instances. Sent SSL requests with client certificates from a test client.
I created self signed certificate in reverse proxy server.
$cd <ws-install-dir>/https-test/config$rm *.db$../../bin/certutil -N -d .$../../bin/certutil -S -d . -n Server-Cert-Reverse-Proxy-Server -s "CN=test.sun.com" -x -t "CT,CT,CT"$../../bin/certutil -L -d .Certificate Nickname Trust AttributesSSL,S/MIME,JAR/XPI Server-Cert-Reverse-Proxy-Server CTu,Cu,Cu
You can use Admin Server CLI to create a self signed certificate
wadm>create-selfsigned-cert --config=test.sun.com --server-name=test.sun.com --nickname=Server-Cert-Reverse-Proxy-Server
For convenience I copied these *.db to origin server instance config directory, and hence used the same server certificate in origin server. In real world use a new server certificate for origin server.
In obj.conf I have confiugured reverse proxy in such a way that all requests are redirected to origin server. In real world situation you can if you want redirect only certain requests depending on your requirements.
Run create-reverse-proxy CLI from Administration server
wadm>create-reverse-proxy --config test --vs test --uri-prefix=/ --server=https://test.sun.com:4444
*obj.conf gets modified as shown below :
<Object name="default">AuthTrans fn="match-browser" browser="*MSIE*" ssl-unclean-shutdown="true"NameTrans fn="map" from="/" name="reverse-proxy-/" to="/"...</Object><Object ppath="*">Service fn="proxy-retrieve" method="*"</Object><Object name="reverse-proxy-/">Route fn="set-origin-server" server="https://test.sun.com:4444"</Object>...
Enable "ssl" in http-listener, added server certificate nickname (if its different from "Server-Cert") and set client authentication as "required" :
You can use Admin Server CLI to do these steps
wadm> set-ssl-prop --config=test.sun.com --http-listener=http-listener-1
server-cert-nickname=Server-Cert-Reverse-Proxy-Server enabled=true client-auth=requiredwadm> deploy-config test.sun.com<http-listener>
<name>http-listener-1</name>
<port>3333</port>
<server-name>test.sun.com</server-name>
<default-virtual-server-name>test</default-virtual-server-name>
<ssl>
<server-cert-nickname>Server-Cert-Reverse-Proxy-Server</server-cert-nickname>
<client-auth>required</client-auth> </ssl>
</http-listener>
In server.xml I have also modified access log format so that we can see what is happening. This will slow down Web Server performance so do not do this in production environment.
<access-log><file>../logs/access</file><format>%Ses->client.ip% "%Req->reqpb.clf-request%" %Req->srvhdrs.clf-status% %Req->srvhdrs.content-length% %Ses->client.cipher% %Req->vars.auth-cert% </format></access-log>
Enable "ssl" in http-listener, added server certificate nickname (if its different from "Server-Cert") and set client authentication as "required" :
<http-listener><name>http-listener-1</name><port>4444</port><server-name>test.sun.com</server-name><ssl><server-cert-nickname>Server-Cert-Reverse-Proxy-Server</server-cert-nickname><client-auth>required</client-auth></ssl><default-virtual-server-name>test</default-virtual-server-name></http-listener>
In server.xml I have also modified access log format so that we can see what is happening. This will slow down Web Server performance so do not do this in production environment.
<access-log><file>../logs/access</file><format>%Ses->client.ip% "%Req->reqpb.clf-request%" %Req->srvhdrs.clf-status% %Req->srvhdrs.content-length% %Ses->client.cipher% %Req->vars.auth-cert% %Req->headers.proxy-auth-cert%</format></access-log>
Created a test.html file that should be served when the client requests for it :
$cat ../docs/test.htmlThis is test.html on origin server
I used "tstclnt" which is bundled with NSS-NSPR binaries in bin directory. Note that I used the server certificate of reverse proxy server as client certificate because I am too lazy to create more certificates. In real world use a proper client certificate.
Created a test request file :
$cat > sslreq.datGET /test.html HTTP/1.0^M^M
Sent request to the reverse proxy server
$tstclnt -h test.sun.com -p 3333 -n Server-Cert-Reverse-Proxy-Server -d https-test/config -c n -v -o -f < sslreq.dattstclnt: connecting to test.sun.com:3333 (address=xxx.xxx.xxx.xxx)...tstclnt: stdin read 27 byteststclnt: Writing 27 bytes to servertstclnt: SSL version 3.1 using 128-bit RC4 with 160-bit SHA1 MACtstclnt: Server Auth: 1024-bit RSA, Key Exchange: 1024-bit RSAsubject DN: CN=test.sun.comissuer DN: CN=test.sun.com...tstclnt: Read from server 350 bytesHTTP/1.1 200 OKServer: Sun-Java-System-Web-Server/7.0Date: Fri, 18 Sep 2009 10:59:13 GMTContent-type: text/htmlLast-modified: Thu, 17 Sep 2009 10:44:10 GMTContent-length: 35Etag: "23-4ab212fa"Accept-ranges: bytesVia: 1.1 https-testProxy-agent: Sun-Java-System-Web-Server/7.0Connection: closeThis is test.html on origin server...
tstclnt: exiting with return code 0
You can see the request is being served from origin server.
I have used in this test client cipher "n" which is SSL3 RSA WITH RC4 128 SHA because I know this cipher that is enabled in Sun Web Server 7.0 update 6. I can
see that at the time of server startup when run in
<log-level>finest</log-level>. You can use other ciphers as well.
$cat ../logs/access format=%Ses->client.ip% "%Req->reqpb.clf-request%" %Req->srvhdrs.clf-status% %Req->srvhdrs.content-length% %Ses->client.cipher% %Req->vars.auth-cert% xxx.xxx.xxx.xxx "GET /test.html HTTP/1.0" 200 35 RC4 MIIBujCCASOgAwIBAgIFAI566gYwDQYJKo...fBqhD710VkFmOScYjWBxZe1vhnTbu/NexX4NqLsZG9So=Note cipher is RC4.
$cat ../logs/accessformat=%Ses->client.ip% "%Req->reqpb.clf-request%" %Req->srvhdrs.clf-status% %Req->srvhdrs.content-length% %Ses->client.cipher% %Req->vars.auth-cert% %Req->headers.proxy-auth-cert%xxx.xxx.xxx.xxx "GET /test.html HTTP/1.1" 200 35 RC4 MIIBujCCASOgAwIBAgIFAI566gYwDQYJKo...fBqhD710VkFmOScYjWBxZe1vhnTbu/NexX4NqLsZG9So= MIIBujCCASOgAwIBAgIFAI566gYwDQYJKo...fBqhD710VkFmOScYjWBxZe1vhnTbu/NexX4NqLsZG9So=Note that as expected in origin-server, rq->headers pblock has the certificate in "proxy-auth-cert". Reverse proxy server sends the certificate to origin server in this header.
Posted by meena ( Sep 18 2009, 05:32:56 PM IST ) Permalink Comments [0]
- Sun Java System Web Server 7.0 Update 6 Administrator's Configuration File Reference - "forward-auth-cert"
- Configuring Reverse Proxy in Sun Java System Web Server 7.0
- Configuring reverse proxy in Sun Java System Web Server 7.0 when origin server is SSL enabled
- About trust flags of certificates in NSS database that can be modified by certutil
- http://forums.sun.com/thread.jspa?threadID=5397719
- http://forums.sun.com/thread.jspa?threadID=5373182
- http://forums.sun.com/thread.jspa?threadID=5359313
This blog copyright 2009 by meena