请给你的短信验证码接口加上SSL双向验证
序言
去年年底閑來(lái)幾天,有位同事專門在網(wǎng)上找一些注冊(cè)型的app和網(wǎng)站,研究其短信接口是否安全,半天下來(lái)找到30來(lái)家,一些短信接口由于分析難度原因,沒(méi)有繼續(xù)深入,但差不多挖掘到20來(lái)個(gè),可以肆意被調(diào)用,雖然不能控制短信內(nèi)容,但可以被惡意消耗,或者用于狂發(fā)信息給那些不喜歡的人。
漏洞分析
短信接收方無(wú)法約束
由于是注冊(cè)型接口,接收方往往都是平臺(tái)內(nèi)不存在的手機(jī)號(hào),所以無(wú)法約束。
接口請(qǐng)求方無(wú)法約束
由于是http(s)接口,任何人都可以請(qǐng)求,只要簡(jiǎn)單分析你的接口。
調(diào)用頻次無(wú)法約束
一般的,接口開(kāi)發(fā)者可能會(huì)想到通過(guò)抓取接口請(qǐng)求者的ip,進(jìn)行頻次約束,但實(shí)現(xiàn)是,他們拿到只是請(qǐng)求者的公網(wǎng)ip,有可能一個(gè)體量很大的局域網(wǎng)用戶,接口開(kāi)發(fā)者抓取到的都是他們的同一個(gè)公網(wǎng)ip,所以通過(guò)ip約束在很多場(chǎng)景下是不能使用的。
漏洞原因
原因其實(shí)很簡(jiǎn)單,接口開(kāi)發(fā)者無(wú)法知道哪些請(qǐng)求是合理的,有些請(qǐng)求是不合理或惡意的,因?yàn)樗姓?qǐng)求者都沒(méi)有身份信息。
漏洞填補(bǔ)
如果你的注冊(cè)功能是web頁(yè)面,最好加上驗(yàn)證碼功能,但使用便利性會(huì)打折。
如果你的注冊(cè)功能是手機(jī)端,那就上SSL雙向驗(yàn)證,中間人既無(wú)法分析你的接口,也無(wú)法發(fā)起請(qǐng)求連接到你接口服務(wù),更不用說(shuō)請(qǐng)求你的接口。
SSL/TLS雙向驗(yàn)證
單向驗(yàn)證
我們平時(shí)瀏覽器請(qǐng)求的https網(wǎng)頁(yè),其實(shí)是SSL/TLS單向的客戶端驗(yàn)證服務(wù)端的證書(shū),也就是服務(wù)端不要求客戶端有公認(rèn)的證書(shū),但客戶端是要求服務(wù)端必須提供受信任的數(shù)字證書(shū)頒發(fā)機(jī)構(gòu)證書(shū)。中間傳輸?shù)臄?shù)據(jù)是加密安全的,但服務(wù)端是無(wú)法得到能代表客戶端的身份信息的,而且,客戶端的請(qǐng)求加密數(shù)據(jù)是可以間接被攔截、解析、重構(gòu)數(shù)據(jù)包再發(fā)送到服務(wù)端的(你可以了解Fiddler是怎么做到分析https接口的)。
雙向驗(yàn)證
雙向驗(yàn)證是指在單向驗(yàn)證的基礎(chǔ)上,服務(wù)端也需要驗(yàn)證客戶端的證書(shū),只有客戶端持有服務(wù)端認(rèn)定的指定證書(shū),服務(wù)端才允許客戶端通過(guò)SSL握手,否則直接關(guān)閉tcp連接。對(duì)于需要雙向驗(yàn)證的https接口,Fiddler也是無(wú)能為力,因?yàn)樗约阂策B接到不到服務(wù)端。
客戶端證書(shū)
客戶端證書(shū)我們不需要花錢去購(gòu)買,使用openssl tools來(lái)自頒發(fā)就可以,服務(wù)端一般驗(yàn)證其thumdata是否滿足就可以了。
安全的asp.net core短信接口
回到實(shí)際干活擼代碼階段,我們可以把短信接口獨(dú)立出來(lái),做單獨(dú)一個(gè)服務(wù),其提供的只有短信功能的接口,接口必須雙向證書(shū)驗(yàn)證,使用 kestrel ,我們很容易加入驗(yàn)證客戶端的代碼邏輯。
public static IWebHostBuilder CreateWebHostBuilder(string[] args){
return WebHost.CreateDefaultBuilder(args)
.UseKestrel((context, options) =>
{
var port = context.Configuration.GetValue<int>("SSL:Port");
var serverCertFile = context.Configuration.GetValue<string>("SSL:ServerCertFile");
var serverCertPassword = context.Configuration.GetValue<string>("SSL:ServerCertPassword");
options.Listen(IPAddress.Any, port, listenOptions =>
{
var httpsConnectionAdapterOptions = new HttpsConnectionAdapterOptions()
{
ServerCertificate = new X509Certificate2(serverCertFile, serverCertPassword),
ClientCertificateMode = ClientCertificateMode.RequireCertificate,
ClientCertificateValidation = (cer, chain, error) =>
{
// 你的驗(yàn)證邏輯
},
};
listenOptions.UseHttps(httpsConnectionAdapterOptions);
});
})
.UseStartup<Startup>();
}
}
Openssl生成cer、key和pfx
openssl genrsa -out openssl.key 1024openssl req -new -x509 -key openssl.key -out openssl.cer -days 3650 -subj /CN=localhost
openssl pkcs12 -export -out openssl.pfx -inkey openssl.key -in openssl.cer
如果你在Postman請(qǐng)求,設(shè)置cer和key文件到postman即可,如果在.net環(huán)境請(qǐng)求這些接口,你需要使用pfx,你可以簡(jiǎn)單理解pfx就是前兩者使用一個(gè)可選的密碼進(jìn)行打包的得到單一文件。關(guān)于證書(shū)本身的內(nèi)容非常龐大,本文不作任何解讀。
.net的客戶端怎么設(shè)置證書(shū)
這里先賣個(gè)關(guān)子,使用WebApiClient庫(kù),可以輕松完成你想要的。
原文地址:https://www.cnblogs.com/kewei/p/10765421.html
.NET社區(qū)新聞,深度好文,歡迎訪問(wèn)公眾號(hào)文章匯總?http://www.csharpkit.com?
總結(jié)
以上是生活随笔為你收集整理的请给你的短信验证码接口加上SSL双向验证的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 「拥抱开源, 又见 .NET」系列第三次
- 下一篇: 编程语言之父谈语言设计,龟叔大赞Type