1、概念簡介
Tomcat 服務器是一個免費的開放源代碼的Web 應用服務器,屬於輕量級應用服務器,在中小型系統和併發訪問用戶不是很多的場合下被普遍使用,是開發和調試 JSP 程序的首選。
HTTP 超文本傳輸協議(HTTP,HyperText Transfer Protocol)是互聯網上應用最爲廣泛的一種網絡協議。所有的WWW文件都必須遵守這個標準。
HTTPS(全稱:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全爲目標的HTTP通道,簡單講是HTTP的安全版。
2、HTTPS和HTTP的區別
1、HTTP 是超文本傳輸協議,信息是明文傳輸,HTTPS 則是具有安全性的 SSL 加密傳輸協議。
2、HTTPS 協議需要到 CA 申請證書,一般免費證書很少,需要交費。
3、HTTP 和 HTTPS 使用的是完全不同的連接方式,用的端口也不一樣,前者是 80,後者是 443。
4、HTTP 的連接很簡單,是無狀態的;HTTPS 協議是由 SSL+HTTP 協議構建的可進行加密傳輸、身份認證的網絡協議,比 HTTP 協議安全。
第一個歷程:生成證書
使用jdk自帶的keytool工具生成證書
證書是單點登錄認證系統中很重要的一把鑰匙,客戶端於服務器的交互安全靠的就是證書;這裏由於是演示所以就自己用JDK自帶的keytool工具生成證書;如果以後真正在產品環境中使用肯定要去證書提供商去購買。
用JDK自帶的keytool工具生成證書方法如下:
keystore的生成方法1
(分階段生成)
keytool -genkey -alias tomcat(別名) -keypass tomcat(別名密碼) -keyalg RSA(算法) -keysize 1024(密鑰長度) -validity 365(有效期,天單位) -keystore /usr/local/tomcat/ssl/tomcat.keystore (指定生成證書的位置和證書名稱) -storepass 123456(獲取keystore信息的密碼) -deststoretype pkcs12(指定證書格式)
回車輸入相關信息即可;
keystore的生成方法2
(一次性生成)
keytool -genkey -alias tomcat -keypass 123456 -keyalg RSA -keysize 1024 -validity 365 -keystore /u.ksr.keystore -storepass 123456 -dname ".keystore -storepass 123456 -deststoretype pkcs12(指定證書格式) -dname “CN=(名字與姓氏), OU=(組織單位名稱), O=(組織名稱), L=(城市或區域名稱), ST=(州或省份.稱, C=(單位的兩字母國家代碼)”;(中英文即可)
[root@master ~]# keytool -genkey -alias tomcat -keypass 123456 -keyalg RSA -keysize 1024 -validity 365 -keystore /root/tomcat.keystore -storepass 123456 -deststoretype pkcs12 -dname "CN=(tomcat), OU=(tomcat), O=(tomcat), L=(beijing), ST=(beijing), C=(cn)"
在root目錄下生成一個名爲tomcat.keystore的證書文件
keystore信息的查看
[root@master ~]# keytool -list -v -keystore /root/tomcat.keystore -storepass 123456
密鑰庫類型: JKS
密鑰庫提供方: SUN
您的密鑰庫包含 1 個條目
別名: tomcat
創建日期: 2018-8-15
條目類型: PrivateKeyEntry
證書鏈長度: 1
證書[1]:
所有者: CN=(tomcat), OU=(tomcat), O=(tomcat), L=(beijing), ST=(beijing), C=(cn)
發佈者: CN=(tomcat), OU=(tomcat), O=(tomcat), L=(beijing), ST=(beijing), C=(cn)
序列號: 346aa6a
有效期爲 Wed Aug 15 22:40:05 CST 2018 至 Thu Aug 15 22:40:05 CST 2019
證書指紋:
MD5: F0:5D:20:97:04:E0:3D:C2:40:FC:40:17:F3:48:E3:36
SHA1: 6D:C8:0B:A9:76:5D:03:20:4D:A4:CD:6F:F5:93:E2:5D:A0:B4:3A:76
SHA256: 46:F1:F8:BB:7E:AF:C5:55:BE:82:65:D2:3C:1A:95:1A:A3:4C:15:28:4D:EC:10:D7:D1:DE:4D:4F:6D:3B:B6:9F
簽名算法名稱: SHA256withRSA
主體公共密鑰算法: 1024 位 RSA 密鑰
版本: 3
缺省情況下,-list 命令打印證書的 MD5 指紋。而如果指定了 -v 選項,將以可讀格式打印證書,如果指定了 -rfc 選項,將以可打印的編碼格式輸出證書。
[root@master ~]# keytool -list -rfc -keystore /usr/local/tomcat/ssl/tomcat.keystore -storepass 123456
密鑰庫類型: JKS
密鑰庫提供方: SUN
您的密鑰庫包含 1 個條目
別名: tomcat
創建日期: 2018-8-15
條目類型: PrivateKeyEntry
證書鏈長度: 1
證書[1]:
-----BEGIN CERTIFICATE-----
MIICejCCAeOgAwIBAgIEA0aqajANBgkqhkiG9w0BAQsFADBwMQ0wCwYDVQQGEwQo
Y24pMRIwEAYDVQQIEwkoYmVpamluZykxEjAQBgNVBAcTCShiZWlqaW5nKTERMA8G
A1UEChMIKHRvbWNhdCkxETAPBgNVBAsTCCh0b21jYXQpMREwDwYDVQQDEwgodG9t
Y2F0KTAeFw0xODA4MTUxNDQwMDVaFw0xOTA4MTUxNDQwMDVaMHAxDTALBgNVBAYT
BChjbikxEjAQBgNVBAgTCShiZWlqaW5nKTESMBAGA1UEBxMJKGJlaWppbmcpMREw
DwYDVQQKEwgodG9tY2F0KTERMA8GA1UECxMIKHRvbWNhdCkxETAPBgNVBAMTCCh0
b21jYXQpMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDdo4jFF69gWQPzvCZl
E520LdQH51aCbTIAAZxHyAnuI2eI5MH+PepK9hWLpaUZ7ldS9IRb3ECG2K2DIzP7
QwM1QyRqHgCQ8jaVhU6oLa7SS9sAlG8Sq+xTbu9EcJhsV/0BTAg2aGKh/+1yIkAA
Vevl0cjhH7RfyicOMWCu2YbnlQIDAQABoyEwHzAdBgNVHQ4EFgQUfViJoJUJec0N
WlZpNavfTk9rmo4wDQYJKoZIhvcNAQELBQADgYEACksq/r+TsIc4DlKxed9FWuqx
YQOtbeFTZmGQbyPQ7CbsAanT4QJbKkNsL/GUSFcG9IswZDPUiWRC1/Tac5jMO19i
YXcDdeABdiSCw8aFrAyy6kkW1371HoDaJ1kEzRTqNmycyMMbuTbkmN2ImzQl0Gro
vMGIcDG4rCgnoMQUNv0=
-----END CERTIFICATE-----
*******************************************
*******************************************
keytool工具介紹
-genkey 在用戶主目錄中創建一個默認文件".keystore",還會產生一個mykey的別名,mykey中包含用戶的公鑰、私鑰和證書
-alias 產生別名
-keystore 指定密鑰庫的名稱(產生的各類信息將不在.keystore文件中)
-keyalg 指定密鑰的算法 (如 RSA DSA(如果不指定默認採用DSA))
-validity 指定創建的證書有效期多少天
-keysize 指定密鑰長度
-storepass 指定密鑰庫的密碼(獲取keystore信息所需的密碼)
-keypass 指定別名條目的密碼(私鑰的密碼)
-dname 指定證書擁有者信息
-list 顯示密鑰庫中的證書信息 keytool -list -v -keystore 指定keystore -storepass 密碼
-export 將別名指定的證書導出到文件
-file 參數指定導出到文件的文件名
-delete 刪除密鑰庫中某條目
-printcert 查看導出的證書信息
-keypasswd 修改密鑰庫中指定條目口令
-storepasswd 修改keystore口令
-import 將已簽名數字證書導入密鑰庫
-certreq 生成證書請求
-changealias 更改條目的別名
-delete 刪除條目
-exportcert 導出證書
-genkeypair 生成密鑰對
-genseckey 生成密鑰
-gencert 根據證書請求生成證書
-importcert 導入證書或證書鏈
-importpass 導入口令
-importkeystore 從其他密鑰庫導入一個或所有條目
-keypasswd 更改條目的密鑰口令
-list 列出密鑰庫中的條目
-printcert 打印證書內容
-printcertreq 打印證書請求的內容
-printcrl 打印 CRL 文件的內容
-storepasswd 更改密鑰庫的存儲口令
keytool -importkeystore [OPTION]...
從其他密鑰庫導入一個或所有條目
-srckeystore <srckeystore> 源密鑰庫名稱
-destkeystore <destkeystore> 目標密鑰庫名稱
-srcstoretype <srcstoretype> 源密鑰庫類型
-deststoretype <deststoretype> 目標密鑰庫類型
-srcstorepass <arg> 源密鑰庫口令
-deststorepass <arg> 目標密鑰庫口令
-srcprotected 受保護的源密鑰庫口令
-srcprovidername <srcprovidername> 源密鑰庫提供方名稱
-destprovidername <destprovidername> 目標密鑰庫提供方名稱
-srcalias <srcalias> 源別名
-destalias <destalias> 目標別名
-srckeypass <arg> 源密鑰口令
-destkeypass <arg> 目標密鑰口令
-noprompt 不提示
-providerclass <providerclass> 提供方類名
-providerarg <arg> 提供方參數
-providerpath <pathlist> 提供方類路徑
-v 顯示密鑰庫中的證書詳細信息
修改配置文件內容
66 APR (HTTP/AJP) Connector: /docs/apr.html
67 Define a non-SSL/TLS HTTP/1.1 Connector on port 8080
68 -->
69 <Connector port="8080" protocol="HTTP/1.1"
70 connectionTimeout="20000"
71 redirectPort="8443" />
72 <!-- A "Connector" using the shared thread pool-->
73 <!--
74 <Connector executor="tomcatThreadPool"
75 port="8080" protocol="HTTP/1.1"
64 Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
65 Java AJP Connector: /docs/config/ajp.html
66 APR (HTTP/AJP) Connector: /docs/apr.html
67 Define a non-SSL/TLS HTTP/1.1 Connector on port 8080
68 -->
69 <Connector port="8080" protocol="HTTP/1.1"
70 connectionTimeout="20000"
71 redirectPort="8443" />
72 <!-- A "Connector" using the shared thread pool-->
73 <!--
74 <Connector executor="tomcatThreadPool"
75 port="8080" protocol="HTTP/1.1"
76 connectionTimeout="20000"
77 redirectPort="8443" />
78 -->
79 <!-- Define a SSL/TLS HTTP/1.1 Connector on port 8443
80 This connector uses the NIO implementation that requires the JSSE
81 style configuration. When using the APR/native implementation, the
82 OpenSSL style configuration is required as described in the APR/native
83 documentation -->
84
85 <Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
86 maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
87 clientAuth="false" sslProtocol="TLS"
88 keystoreFile="/root/tomcat.keystore"
89 keystorePass="123456"
90 />
91
92
93 <!-- Define an AJP 1.3 Connector on port 8009 -->
94 <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
95
96
說明:certificateKeystoreFile 證書文件存放位置
certificateKeystoreType 證書文件類型
certificateKeystorePassword 證書的密碼
重啓tomcat服務,輸入 https://IP地址
進行訪問測試
這裏不輸入端口號,只是輸入IP地址
實現HTTP自動跳轉爲HTTPS
上面我們實現了HTTPS訪問,但是客戶使用http訪問,還是會走http協議,依然是不安全的,沒有達到我們的需求,下面配置HTTP自動跳轉到HTTPS。
第一個歷程:修改web.xml文件
在web.xml文件中後面,也就是倒數第二行裏,加上如下配置:
在該文件後面加上這樣一段:
<login-config>
<!-- Authorization setting for SSL -->
<auth-method>CLIENT-CERT</auth-method>
<realm-name>Client Cert Users-only Area</realm-name>
</login-config>
<security-constraint>
<!-- Authorization setting for SSL -->
<web-resource-collection >
<web-resource-name >SSL</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
第二個歷程:修改server.xml文件
第三個歷程重啓tomcat服務並查看端口
[root@test bin]# shutdown.sh
Using CATALINA_BASE: /application/tomcat
Using CATALINA_HOME: /application/tomcat
Using CATALINA_TMPDIR: /application/tomcat/temp
Using JRE_HOME: /application/jdk
Using CLASSPATH: /application/tomcat/bin/bootstrap.jar:/application/tomcat/bin/tomcat-juli.jar
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256m; support was removed in 8.0
[root@test bin]# startup.sh
Using CATALINA_BASE: /application/tomcat
Using CATALINA_HOME: /application/tomcat
Using CATALINA_TMPDIR: /application/tomcat/temp
Using JRE_HOME: /application/jdk
Using CLASSPATH: /application/tomcat/bin/bootstrap.jar:/application/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@test bin]# netstat -ntpl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 6827/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 6976/master
tcp6 0 0 :::8009 :::* LISTEN 7353/java
tcp6 0 0 :::80 :::* LISTEN 7353/java
tcp6 0 0 :::22 :::* LISTEN 6827/sshd
tcp6 0 0 ::1:25 :::* LISTEN 6976/master
tcp6 0 0 :::443 :::* LISTEN 7353/java
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 7353/java
[root@test bin]#
測試: