1. 準(zhǔn)備域名
既然是白嫖,那么域名我們就使用免費(fèi)的域名就好了梳玫,我在freenom網(wǎng)站上注冊(cè)的。免費(fèi)的都是比較偏的域名后綴墓怀,不過(guò)無(wú)所謂汽纠,反正測(cè)試用而已
做好域名解析,我這里本地測(cè)試使用傀履,所以解析到自己的內(nèi)網(wǎng)ip(能指向本機(jī)就行啦)
2. 準(zhǔn)備https證書
CA證書的話虱朵,有兩種選擇,一種使用自簽名證書钓账,一種使用CA官方證書;
區(qū)別:
- 自簽名證書是“黑戶”梆暮,只能起到https加密的作用,但是無(wú)法被瀏覽器啦粹、操作系統(tǒng)承認(rèn)
- 具體效果就是瀏覽器訪問(wèn)時(shí)會(huì)顯示“不安全連接”的圖標(biāo)和提示
- 自簽名證書無(wú)法防范“中間人攻擊”方式,其實(shí)還是不安全的通信方式(客戶端的可以自己去實(shí)現(xiàn)加密通信策略)
- 使用CA證書需要付費(fèi)唠椭,并且有時(shí)限跳纳,要考慮成本和注意到期續(xù)費(fèi)問(wèn)題(過(guò)期的CA證書等同于自簽名證書)
2.1 免費(fèi)CA證書申請(qǐng)
免費(fèi)的CA證書申請(qǐng)渠道很多,基本是1年期限寺庄,我這里使用freessl,注冊(cè)流程忽略斗塘,沒什么好說(shuō)的(其中一步域名驗(yàn)證赢织,只要做好相關(guān)解析,等解析生效驗(yàn)證過(guò)關(guān)即可)
2.1.1 生成CA證書
申請(qǐng)成功后馍盟,可以啟動(dòng)網(wǎng)站提供的客戶端“keyManager”于置,在“證書管理--選中某個(gè)證書--更多--所有格式--輸入私鑰加密密碼--導(dǎo)出”
導(dǎo)出后有多個(gè)文件夾朽合,對(duì)應(yīng)不同的web服務(wù)器,我將使用tomcat服務(wù)器曹步,所以選用“.jks”后綴的私鑰
3. 準(zhǔn)備java web項(xiàng)目
我這里準(zhǔn)備了個(gè)簡(jiǎn)單的spring boot項(xiàng)目,寫了一個(gè)簡(jiǎn)單的接口尿孔,用于后續(xù)移動(dòng)端https請(qǐng)求用
核心代碼
入口類
package com.lawyee;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
@SpringBootApplication
public class AppBoot extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(AppBoot.class);
}
// spring boot項(xiàng)目部署到獨(dú)立的tomcat服務(wù)器上筹麸,需要繼承SpringBootServletInitializer類,重寫配置資源路徑方法
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(AppBoot.class);
}
}
準(zhǔn)備接口
package com.lawyee.controller;
import com.lawyee.domain.Order;
import com.lawyee.domain.ResVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
@RestController
@RequestMapping("/order")
@Slf4j
public class OrderController {
@RequestMapping("/findById")
public ResVo findOne(String sn) {
if (null == sn) {
log.error("查詢訂單號(hào)為空");
return new ResVo(0, "查詢訂單號(hào)為空", null);
}
if (sn.length() < 6) {
log.warn("訂單號(hào)不能小于6位");
return new ResVo(0, "訂單號(hào)不能小于6位", null);
}
Order order = new Order(sn, new Date(), "雅迪電動(dòng)車");
ResVo resVo = new ResVo(1, "查找到1個(gè)符合訂單", order);
log.debug("查詢出1個(gè)結(jié)果白指,訂單號(hào):{}酵紫,詳細(xì)信息:{}", sn, order);
return resVo;
}
}
4. 準(zhǔn)備https的web服務(wù)器
- 我這里使用
apache-tomcat-8.5.31
做web服務(wù)器,從官網(wǎng)下載即可奖地; - 把之前第二步中生成的CA證書tomcat目錄下,
.jks
后綴的文件参歹,拷貝到tomcat根目錄下的conf
文件夾中 - 將第三步中的java web工程,打包成war包僧界,拷貝到tomcat根目錄下的
webapps
文件夾中 - 修改
conf
文件夾下的server.xml
配置文件
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener"/>
<!-- Security listener. Documentation at /docs/config/listeners.html
<Listener className="org.apache.catalina.security.SecurityListener" />
-->
<!--APR library loader. Documentation at /docs/apr.html -->
<Listener SSLEngine="on" className="org.apache.catalina.core.AprLifecycleListener"/>
<!-- Prevent memory leaks due to use of particular java/javax APIs-->
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/>
<!-- Global JNDI resources
Documentation at /docs/jndi-resources-howto.html
-->
<GlobalNamingResources>
<!-- Editable user database that can also be used by
UserDatabaseRealm to authenticate users
-->
<Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase"/>
</GlobalNamingResources>
<Service name="Catalina">
<!-- 使用80接口捎泻,指定跳轉(zhuǎn)到443接口埋哟,https默認(rèn)接口 -->
<Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="443"/>
<!-- 配置https,默認(rèn)接口443赤赊,keystoreFile指定私鑰文件路徑, keystorePass指定私鑰密碼-->
<Connector port="443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
keystoreFile="conf/lixian.jks"
keystorePass="123456"
clientAuth="false" sslProtocol="TLS" />
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector URIEncoding="UTF-8" port="8009" protocol="AJP/1.3" redirectPort="8443"/>
<Engine defaultHost="localhost" name="Catalina">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
</Realm>
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t "%r" %s %b" prefix="localhost_access_log" suffix=".txt"/>
</Host>
</Engine>
</Service>
</Server>
- 修改
conf
文件夾下的web.xml
配置文件,讓訪問(wèn)http也跳轉(zhuǎn)到https哄孤,在文件最后吹截,添加以下配置代碼
<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>
- 啟動(dòng)服務(wù)器后,使用證書對(duì)應(yīng)的域名訪問(wèn)波俄,瀏覽器地址欄左側(cè)會(huì)顯示一個(gè)鎖的圖標(biāo),點(diǎn)擊開來(lái)會(huì)顯示
連接是安全的
懦铺;(如果使用本地ip或者其他解析的域名,或者自簽名證書趁窃,這里一樣是顯示不安全的鏈接) - 注意:CA證書急前、證書對(duì)應(yīng)的域名必須一致(包括記錄值,除非你的證書是*通配的<通配的證書很貴的>)
5. 奉上以上文件
6. 客戶端請(qǐng)求看效果
這里用iOS客戶端發(fā)起請(qǐng)求裆针,再用青花瓷抓包看看https通信的效果
6.1 準(zhǔn)備OC網(wǎng)絡(luò)請(qǐng)求代碼
[[AFHTTPSessionManager manager] GET:@"https://www.lixian.ml/addr/order/findById" parameters:@{@"sn": @"6666231"} progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"responseObject = %@", responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"error = %@", error);
}];
6.2 用青花瓷抓包
https抓包效果:通信自動(dòng)被加密
http抓包效果:通信未加密据块,全是明文