我正在使用Eclipse,JSF 2,Tomcat 7和Primefaces 5开发JSF应用程序。我已经实现了与OpenSsl建立SSL连接(https)。
我希望我的应用程序按下登录表单中的按钮,并显示浏览器商店中的个人X509证书列表。许多Web实现了这个功能,所以我意识到这是可能的,而且不使用applet。
难道这么难吗?我正在寻找例子,但我找不到任何东西。
答案 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.
}
}
我希望这会让你朝着正确的方向前进,