如何在JSF中显示个人证书?

时间:2014-09-09 17:29:48

标签: jsf openssl x509certificate

我正在使用Eclipse,JSF 2,Tomcat 7和Primefaces 5开发JSF应用程序。我已经实现了与OpenSsl建立SSL连接(https)。

我希望我的应用程序按下登录表单中的按钮,并显示浏览器商店中的个人X509证书列表。许多Web实现了这个功能,所以我意识到这是可能的,而且不使用applet。

难道这么难吗?我正在寻找例子,但我找不到任何东西。

1 个答案:

答案 0 :(得分:1)

正如你在评论中所说,你遵循这个tutorial并且你可以配置你的tomcat使用双向ssl,现在你有下一个问题,我试着给你一些指导线:

  

(1)仅显示我在示例中创建的证书

问题可能是您的浏览器仅显示由服务器信任库中加载的自签名CA颁发的证书。这是你的server.xml你的tomcat <Connector>中的那个:

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
truststoreFile=".../cacerts.jks" truststorePass="changeit"
keystoreFile="..../keystore.jks" keystorePass="changeit"
clientAuth="true" sslProtocol="TLS" />

因此,如果您希望浏览器显示由特定CA颁发的所有客户端证书,例如verisign(可能在您的情况下是dnie,fnmt?),则必须添加颁发者CA证书(如果需要,还可以添加中间证书)在cacerts.jks。您可以使用java keytool(您可以在JAVA_HOME/bin/keytool中找到它)

keytool -import -trustcacerts -alias yourCaAlias -file CA_certificate.crt -keystore cacerts.jks
  

(2)每次访问我的应用程序时都会发生这种情况,我只希望按下按钮时会发生这种情况。

这可以通过不同的方式实现,例如,一个简单的方法是在tomcat server.xml文件中配置两个连接器;一个用于通过http进行公共访问,另一个用于通过https进行私有访问。在公共部分,您可以使用登录按钮和一些内容登录页面,当用户单击登录按钮时,webapp可以重定向到您已配置客户端身份验证的连接器(https://yourserver.com/blabla.. 。)所以浏览器提示用户选择有效的证书进行身份验证,然后在你的webapp中你可以配置一个servlet来执行证书验证和webapp所需的东西,如下所示:

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.security.cert.X509Certificate;

// Extend HttpServlet class
public class ServletCertificateSample extends HttpServlet {
    private String message;

    public void init() throws ServletException {
        // Do required initialization
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

    }

    private X509Certificate getCertificate(HttpServletRequest request) throws ServletException
            X509Certificate[] certs = (X509Certificate[]) request.getAttribute("javax.servlet.request.X509Certificate");
            if (null != certs && certs.length > 0) {
                // cert found
                // performs certificate operations...
            }
            throw new ServletException("No client certificate found");
    }

    public void destroy() {
        // do nothing.
    }
}

我希望这会让你朝着正确的方向前进,