---
layout: post
title: 为自己的i2p站点添加一个SSL证书
tags: [SSL, i2p, 隐私, 网络]
---

  虽然没啥用，不过很有意思所以还是整一个！<!--more-->    

# 起因
  在上个月，我用[i2pd](/2022/11/23/i2p.html)和[tor](/2022/11/16/tor.html)在两个不同的匿名网络上试着建了网站，不过因为这些网络的特性，他们不需要使用HTTPS访问就能保证内容不被窃取和篡改。不过SSL证书的意义不止这些，还有一个很重要的意义是验证网站身份，比如[Facebook](https://www.facebookwkhpilnemxj7asaniu7vnjjbiltxjqhye3mhbshg7kx5tfyd.onion/)就有一个被信任的EV SSL证书，它的意义就是在保证其他人也偷偷算了一个facebook开头的域名（家用电脑大概花1天左右的时间就能算出来）时能很轻易的知道这个网站是不是真的Facebook的网站，因为EV SSL证书的审核很严格，基本上没办法去伪造一个相同公司的。Onion的DV SSL我查了一下，普通人倒是也能整，有家叫[HARICA](https://www.harica.gr/en/Products/SSL)的证书商家每年花30EUR就可以在上面买一个。不过我嘛……肯定是不愿意花钱的，所以就打消了整Onion的证书的想法。   

# 探索I2P的SSL证书
  那i2p域名呢？因为Tor有一定的政府背景，而且有大公司撑腰，所以受到了那些管理互联网的组织的承认，才会被允许注册可信的SSL证书。而i2p怎么说还是一个比较小的项目，虽然它可能是除了Tor外第二大的匿名路由网络（不是Freenet之类的共享内容的网络，那种东西没法交互），不过没有靠山，就不会被那些管理互联网的组织所承认，也就不可能允许注册可信的SSL证书……那难道就没有办法了吗？作为社区动力的项目，什么政府啊，还是什么标准化的组织都是没用的东西，不被承认可以自己承认！正好我在逛i2p那些网站的时候看到了一个由i2pd的开发团队PurpleI2P所维护的一个[CA](http://ca.i2pd.i2p/)，从这个CA签名的证书虽然也只是自签名的，但是他们开发的浏览器[I2PdBrowser](https://github.com/PurpleI2P/i2pdbrowser)内嵌了这个CA证书，所以也可以看作是可信的证书了（至少在这个浏览器上是）。具体的申请方法很简单，网站上都有说，给作者发邮件申请就行了，至于怎么用普通的邮箱给mail.i2p发邮件……只要把它替换成官方网关i2pmail.org就可以了。   
  虽然证书很容易申请，但是申请下来的证书部署到网站上之后怎么才能被访问那还是挺麻烦的。因为网络上完全没有相关的教程，毕竟i2p用的人就少，i2pd更少，用i2pd还整SSL证书的人可能全世界一只手都数得过来😂。这没办法我只能先看着i2pd的文档先自己琢磨，结果怎么整效果都不对……没办法就只好问作者了，他回复的原文如下：
> It  must  be added like current tunnel for HTTP with same key. Example with HTTP and HTTPS:
> ```
> [website]
> type = http
> host = 127.0.0.1
> port = 8080
> inport = 80
> inbound.length = 2
> outbound.length = 2
> inbound.quantity = 3
> outbound.quantity = 3
> gzip = false
> keys = website.dat
> 
> [website-SSL]
> type = server
> host = 127.0.0.1
> port = 8443
> inport = 443
> keys = website.dat
> ```
> Note  that  I  use  same  key file both for HTTP and HTTPS tunnel, and HTTPS  (443  port)  using type `server`, because i2pd mustn't interact with encrypted by SSL data.   
> Also, you can skip the i2cp options in the second tunnel, because they apply  to  all  tunnels  with the same key. The main thing is to write them only in the first tunnel.   

  这下我总算搞明白我之前配置的问题出在哪了😂，它文档里写的关于inport的说明是“what port at local destination server tunnel listens to. Same as port by default”，我看到它说的“local destination”以为是隧道访问的那个端口，结果是面向隐形网络的端口……怪不得我配置之后返回的证书老是443端口的证书……而且http隧道文档里也没有说到关于inport的参数啊，还有那个莫名其妙的ssl参数……这文档写的真是有点不太行……   
  按照邮件说明配置好之后总算可以正常访问了，试了一下用I2PdBrowser访问我的网站终于出现了代表加密的小锁。   

# 感想
  不过他们对生成证书的要求实在是不严格，我不需要证明任何东西，就能获得任意i2p网站的SSL证书（当然，也起不到验证网站身份的功能），不过由于这个网络的特点，也没办法中间人攻击，而且本来用的人就少，估计他们也是当玩吧😂，所以也没有认真搞。另外其实那个域名系统也一样，注册也很随便……   
  不过搞的过程还是挺有意思的，如果有谁有兴趣也可以搞一个玩玩。