最近回到公司总部上班,但是总部的网络环境略糟糕,屏蔽了绝大部分的端口,ping和tracert工具也失效了,只有80,443,110,25,143端口开放了,该死的网管连加密的imap和smtp端口都封了,真是让人吐槽无力。

因为封了22端口,所以不能远程连接回家里的路由,机缘巧合下,发现了一个神奇的东西,叫sslh

sslh是一个端口复用工具,它可以复用HTTP, SSL, SSH, OpenVPN, tinc, XMPP等协议,就是说同一个端口,你用SSH协议去连接,就会传递给SSH服务器,用SSL协议去连接,就会传递给https服务器,这不就是我想要的么!

配置文件非常简单,就只有那么几个选项:是否启用sslh,ssh服务器地址,https服务器地址,填上之后启动就OK。

这里要注意的是,sslh本身默认监听443端口,是和默认的https端口冲突的……但是默认的配置文件里面https的服务器地址就是127.0.0.1:443,这是需要修改的。

配置好之后用443端口SSH登陆,OK!再用https访问,OK!

 

前阵子在nginx上做了客户端证书认证,发现满足感大大的有,于是一发不可收拾,在RaspberryPi上的Apache也做了一个。

上参考:

http://www.adintr.com/article/blog/192

http://httpd.apache.org/docs/2.2/mod/mod_ssl.html

 

首先,第一步是做证书。

这部分是老生常谈了,懒人表示继续在路由上用easyrsa做(参考1参考2),写了一份server的key和crt之后就可以拿来用了。(之前我有CA证书和客户端证书了)

然后到手3个文件, server.key server.crt ca.crt。

修改/etc/apache/sites-available/default-ssl

找到这些字段

SSLCertificateFile
SSLCertificateKeyFile
SSLVerifyClient
SSLCACertificateFile
SSLVerifyClient

去掉注释之后,分别填上 server.crt的位置,server.key的位置,”on”,ca.crt的位置,”require”,就像这样

SSLEngine on
SSLCertificateFile    /etc/apache2/certs/pi.crt
SSLCertificateKeyFile /etc/apache2/certs/pi.key
SSLCACertificateFile /etc/apache2/certs/ca.crt
SSLVerifyClient require

配置也完成了。

然后启用一下ssl的mod和这个默认的ssl配置,就是分别做一下软连接。

最后启动/重启apache服务器,好了,看到浏览器问你要证书了。

之前因为没怎么弄懂这个,于是总是没法再vhosts启用独立的证书,导致一直都只能有一个使用https链接,今天因为刚买了一个域名,于是将全部的vhosts都改了一下,终于弄懂是怎么回事。

官方文档一堆一堆的英文真是看得我头痛呢, 后来折腾的时候终于弄懂它说的是什么意思……

首先,你需要一个这样的设定

$SERVER["socket"] == ":443" {
server.document-root = "/www/site"
ssl.engine = "enable"
ssl.pemfile = "/etc/lighttpd.keys/cert.pem"
}

当你需要在vhosts上使用的时候,你需要这样写

$SERVER["socket"] == ":443" {
    ssl.engine = "enable"
    ssl.pemfile = "/path/to/cert.pem"

    $HTTP["host"] == "host1.com" {
    #some server setting
    )
    }
    $HTTP["host"] == "server2.com" {
    #some server setting
    }
}

然后,在另外的vhosts的设定里面加上

ssl.pemfile = "/etc/lighttpd/keys/certs.pem"

这样就可以覆盖掉证书的默认值从而使用不同的证书。

最近自己重新做固件嗯,因为某些癖好(算是吧,因为太钟爱于https了),一直在启用luci的https,可是不知道为什么,uhttpd的TLS插件无法启用,于是蛋疼了,我擦嘞,不了个是吧,不带这样玩啊…

于是只能启用不安全的uhttpd,让我一阵纠结,心里总是没有安全感…

一晃打开了transmission-web,突然想起了以前看到过的一个老外写的blog,说想远程管理transmission,但是transmission又没有密码保护(现在的版本好像有了),于是就用个nginx做前端,加上密码认证,就可以避免别人过来搞东搞西了。

这给了我启发,为什么不用nginx做SSL的前端呢?效果是一样的啊,顺带transmission的远端管理也可以做了,一举双得。

于是我动手了

首先是重新编译了一次nginx,因为官方编译的nginx没有包含ssl支持

然后启动了普通版的uhttpd,开始监听之后,修改nginx的配置,打开ssl支持,加上证书个密钥(因为用的是以前的证书,所以不用重新签),再写个proxy_pass(这个似乎有点问题,如果写到了location /path/ 中之后出现了问题,似乎是东西显示不完全,格式有点乱,后来写到 location / 中就没有问题了)

顺便把transmission的web管理加上,reload一次之后就完全没问题了。除了载入速度略有下降(transmission的web管理速度慢了稍微有点多)

附上一下配置文件

server {
listen 443;
server_name Router;

charset utf8;

ssl on;
ssl_certificate /etc/ssl/CA/keys/luci_school.crt;
ssl_certificate_key /etc/ssl/CA/keys/luci.key;

ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

location / {
proxy_pass ;
proxy_redirect default;
}
location /transmission {
proxy_pass ;
proxy_redirect default;
}
}

嘛~是因为准备做来练练手什么的,于是我就弄出来了。

以下是参考书:
http://www.chinaunix.net/jh/6/16469.html

成品:

到Luci的安全连接
到Luci的安全连接

 

要求的软件包:
openssl-util
luci-ssl
uhttpd-mod-tls

切换目录到/etc/ssl/certs
———————————————–开端的分割线————————————————-
首先,是创建自己的证书:

openssl genrsa -out ca.key 1024

openssl req -new -x509 -days 3650 -key ca.key -out ca.crt

*这里需要输入信息
Country Name: CN 两个字母的国家代号
State or Province Name: GuangDong 省份名称
Locality Name: GuangZhou 城市名称
Organization Name: Family Network 公司名称
Organizational Unit Name: Home 部门名称
Common Name: Ferrets 你的姓名
Email Address: Ferrets@live.cn Email地址
得到ca.crt
这是CA证书,添加到“受信任的证书颁发机构”,或是“受信任的发布者”,以信任自己所颁发的证书

 

openssl genrsa -out server.key 1024

 得到密钥

openssl req -new -key server.key -out server.csr

这是证书签署请求,在自己签署之后可以删掉

 

接下来是签署(sign.sh

上面是一个sign.sh的脚本,用来签署证书,请放到/etc/ssl/certs,加上可以运行的属性。

./sign.sh server.csr

然后就是确认信息,确认添加数据到数据库(虽然我不知道用不用的上)

得到server.crt
这是服务器证书,添加到“个人”,以信任自己的网站。

————————————————承上启下的分割线———————————————–
接下来是启用这个自己签署的证书了。
在装上luci-ssl和uhttpd-mod-tls之后,uhttpd应该就可以监听443端口了。
修改“/etc/config/uhttpd”
找到“option cert” 修改后面的值为“/etc/ssl/certs/server.crt”
找到“option key” 修改后面的值为“/etc/ssl/certs/server.key”
*这里要注意一下,如果你没有ipv6的路由的话就不要监听[::]:443,会找不到的,监听0.0.0.0:443
保存,重启uhttpd。
————————————————华丽谢幕的分割线————————————————
接下来,请尝试用https来访问自己的路由吧~