Java安全教程–创建SSL连接和证书的分步指南

一步步 在有关应用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选项卡,然后根据我们上面创建的证书将“证书昵称”修改为“服务器别名”。

应用程序服务器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浏览器检查示例应用程序的证书详细信息:

Localhost证书详细信息

希望我的读者能够理解如何创建数字证书和保护Web应用程序。 如果您喜欢本文,请在社交网站上分享,并帮助我们成长。

在下面下载示例代码:



翻译自: https://www.javacodegeeks.com/2013/06/java-security-tutorial-step-by-step-guide-to-create-ssl-connection-and-certificates.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值