在有关应用JEE安全性的系列文章中,我们为您提供了另一个有关如何在Java EE应用程序中创建SSL连接和创建证书的详细教程。 如我们之前的文章中所述, 安全套接字层(SSL)/传输层安全性(TLS)将启用客户端和Web服务器之间的安全连接。 客户端将使用HTTPS连接来使用Web资源。 Java提供了各种基于安全性的API,可以帮助与客户端建立安全连接并以加密格式发送/接收消息:
- Java密码体系结构(JCA)
- Java密码扩展(JCE)
- Java安全套接字扩展(JSSE)
为了启用SSL连接,Web服务器需要具有数字证书 ,该数字证书将允许客户端信任Web应用程序的真实性。 想要发送加密消息的应用程序向证书颁发机构(CA)申请数字证书。 CA验证应用程序所有者详细信息和其他标识详细信息,并颁发数字证书。
在公钥基础结构(PKI)方案中,数字证书由CA颁发,其中包含专有名称(DN)/所有者的名称/主题,用于唯一标识证书的序列号,所有者的公钥,发行日期,有效期,专有CA的名称,颁发机构(CA)的数字签名,用于创建签名的签名算法 。 CA颁发的数字证书可以保存在注册表中,以便进行身份验证的用户可以使用所有者的公共密钥。
浏览器如何使用证书识别应用程序或网站的真实性?
所有商业CA与主要的Web浏览器都有关系,因此其根证书将嵌入在其浏览器中。 可以通过证书存储检查浏览器的SSL兼容性,该证书存储提供有关存储在浏览器存储中的CA证书的信息。 另外,CA网站还提供有关浏览器的SSL兼容性的信息。
下图显示了示例网站http://abcgen.uk的证书详细信息。 下面的证书向客户保证所有者的真实性已得到验证,并且数字证书已颁发给ABCGen Idiotechie plc,其通用名称为www.abcgen.uk。
注意:出于安全原因,我们未对实时网站进行任何引用。 本文中使用的示例仅用于说明和学习目的。 此示例显示证书由Verisign颁发为Class 3,这表示Verisign已对所有者进行了独立的验证和确认。 这不是指定的PKI标准。 下一个字段表示此证书的有效性。 指纹表示公钥,但采用编码格式。 使用密码散列函数SHA1和MD5对数据进行散列。
下图显示了证书层次结构。 第一项表示根证书,第二项表示扩展的验证。 证书颁发机构(CA)提供称为扩展验证的更高安全性证书。 所有主要的Web浏览器的密钥库都将包含有关根和扩展验证的信息,这将使它们能够验证特定应用程序的真实性。
希望大家都明白了。 现在让我们尝试一些编码。
使用的产品:
- IDE: Netbeans 7.2
- Java开发套件(JDK):版本6
- Glassfish服务器: 3.1
- 身份验证机制:基于表单的身份验证
- 验证服务器: LDAP OpenDS v2.2
目的:
在Web服务器和客户端之间创建SSL连接。
步骤1:
在Glassfish服务器中创建服务器证书
在Windows中打开命令提示符->转到{domain_dir} / config目录,其中{domain_dir}表示Glassfish域路径。
例如C:\ NetBeans \ 7.2 \ config \ GF3 \ domain1 \ config>
第2步:
我们将使用keytool命令生成证书。 Keytool是Java SE 6提供的密钥和证书管理实用程序。
运行keytool命令,如下所示:
>keytool -genkey -alias server-alias -keyalg RSA -keypass changeit -storepass changeit -ke
ystore keystore.jks
The command will ask for the following details:
What is your first and last name?
[Unknown]: localhost <<For testing purposes we need to use localhost since it maps to the application server hostname. Ideally in production environments this field should include application server’s name.>>
What is the name of your organizational unit?
[Unknown]: idiotechie
What is the name of your organization?
[Unknown]: idiotechie
What is the name of your City or Locality?
[Unknown]: edinburgh
What is the name of your State or Province?
[Unknown]: EDN
What is the two-letter country code for this unit?
[Unknown]: GB
Is CN=localhost, OU=idiotechie, O=idiotechie, L=edinburgh, ST=EDN, C=GB correct?
[no]: YES
第三步:
将生成的证书导出到server.cer文件。
>keytool -export -alias server-alias -storepass changeit -file server.cer -keystore keysto
re.jks
Certificate stored in file <server.cer>
第四步:
将证书添加到信任存储文件
>keytool -import -v -trustcacerts -alias server-alias -file server.cer -keystore cacerts.j
ks -keypass changeit -storepass changeit
Owner: CN=localhost, OU=idiotechie, O=idiotechie, L=edinburgh, ST=EDN, C=GB
Issuer: CN=localhost, OU=idiotechie, O=idiotechie, L=edinburgh, ST=EDN, C=GB
Serial number: 519e7165
Valid from: Thu May 23 20:43:33 BST 2013 until: Wed Aug 21 20:43:33 BST 2013
Certificate fingerprints:
MD5: 34:B7:71:CD:C9:56:9A:EA:0C:F2:91:50:EA:7F:4B:64
SHA1: AA:DE:EC:1B:27:8E:BC:3A:7A:82:8C:B7:FA:C3:AA:11:2F:97:1F:2C
Signature algorithm name: SHA1withRSA
Version: 3
Trust this certificate? [no]: YES
Certificate was added to keystore
[Storing cacerts.jks]
步骤5:
验证证书是否已成功添加到密钥库中。
>keytool -list -v -keystore keystore.jks
Enter keystore password:
Alias name: server-alias
Creation date: 23-May-2013
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=localhost, OU=idiotechie, O=idiotechie, L=edinburgh, ST=EDN, C=GB
Issuer: CN=localhost, OU=idiotechie, O=idiotechie, L=edinburgh, ST=EDN, C=GB
Serial number: 519e7165
Valid from: Thu May 23 20:43:33 BST 2013 until: Wed Aug 21 20:43:33 BST 2013
Certificate fingerprints:
MD5: 34:B7:71:CD:C9:56:9A:EA:0C:F2:91:50:EA:7F:4B:64
SHA1: AA:DE:EC:1B:27:8E:BC:3A:7A:82:8C:B7:FA:C3:AA:11:2F:97:1F:2C
Signature algorithm name: SHA1withRSA
Version: 3
步骤6:
验证证书是否已成功添加到信任存储中。
>keytool -list -keystore cacerts.jks
Enter keystore password:server-alias, 23-May-2013, trustedCertEntry,
Certificate fingerprint (MD5): 34:B7:71:CD:C9:56:9A:EA:0C:F2:91:50:EA:7F:4B:64
因此,现在证书在密钥库和信任库中都可用。 密钥库包含服务器的私钥,而信任库仅包含CA证书或公用密钥。 这是对证书和密钥的更清晰的划分,其中可以将私钥保存在密钥库中更安全的环境中,而将公钥保留在信任库中的更易访问的选项中。
但是,在此示例中,由于我们没有CA证书,因此服务器证书存储在受信任的存储区中。
步骤7:
从服务器配置的角度来看,让我们转到服务器管理控制台。
然后单击配置->服务器配置-> HTTP服务-> http-listeners-2。
Http-Listeners-2表示安全的HTTPS端口8181。 单击SSL选项卡,然后根据我们上面创建的证书将“证书昵称”修改为“服务器别名”。
步骤8:
重新启动服务器。
至此,所有与服务器相关的配置都已完成。
让我们进入应用程序代码。
我们将使用与http://idiotechie.com/secure-web-application-in-java-ee6-using-ldap/相同的应用程序代码。
唯一需要的更改是在web.xml中 ,其中的传输保证将从无更改为机密。
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
当应用程序希望阻止其他实体查看传输内容时,将使用机密保护模式。
生成,部署和运行应用程序。
现在,即使您尝试键入URL http:// localhost:9999 / SampleWebApp / index.jsp ,服务器也会通过https:// localhost:8181 / SampleWebApp / index.jsp将用户重定向到安全的HTTPS连接。 由于服务器生成的证书是自签名证书,而不是来自CA的证书,因此浏览器会发出警告消息,通知您无法信任网站的安全证书。 这是因为浏览器的信任库不包含这些证书。
我们可以将证书添加到浏览器的例外列表中,以避免将来出现警告。 现在,让我们尝试从Mozilla Firefox浏览器检查示例应用程序的证书详细信息:
希望我的读者能够理解如何创建数字证书和保护Web应用程序。 如果您喜欢本文,请在社交网站上分享,并帮助我们成长。
在下面下载示例代码:
翻译自: https://www.javacodegeeks.com/2013/06/java-security-tutorial-step-by-step-guide-to-create-ssl-connection-and-certificates.html