标签归档:SSL

将博客的https连接加强了

嗯,前几天已经强制了对博客使用https访问……感觉很好很强大,博客的等级突然就高起来了。

今天偶尔发现一个网站(https://www.ssllabs.com/ssltest/index.html),可以检查网站的安全性,于是兴冲冲的去测试了一下,结果发现了几个小问题(主要的,更零碎的就没管了)。

  • 启用了一种长度较短的加密算法;
  • 没有提供完整的证书链;
  • 可能受到BEAST攻击;

前面两个的话好说,稍微查了一下网络就ok,而且startssl也提供了完整的安装教程(lighttpd Apache nginx),略后悔没有仔细看。

问题是最后一个,BEAST攻击究竟是什么啊……

上网做了很多很多的Google,还打错字了,打成了beats,于是魔声总是出来捣乱。

最后,在一个网站(http://permalink.gmane.org/gmane.linux.debian.devel.security/16698)找到了一份方案,看起来像是一份邮件的备份。

里面提到了lighttpd的解决办法,就是在配置文件里面指定一下加密的算法,并且让服务器优先使用某些算法,就可以组织这种攻击了。

ssl.cipher-list =  "ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!EDH:!AESGCM"
ssl.honor-cipher-order = "enable"

应用了之后,再去做测试,果然BEAST攻击的提示没有了。

 

SSLLab测试结果

SSLLab测试结果

在Apache上使用客户端证书认证

前阵子在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服务器,好了,看到浏览器问你要证书了。

在Nginx中使用客户端证书认证

其实这个东西很久以前就想搞的了,一直没动手,直到最近总在外面跑,有时候就考虑连回家里,于是稍微动了一下手。

选nginx是因为这个服务器够轻型,做前端最好了,而且做前端的话以前也做过,有经验。

上连接:

http://blog.csdn.net/kunoy/article/details/8239653



http://blog.csdn.net/jinhill/article/details/2573777
签证书什么的感觉略微有点麻烦了,于是果断的用了openvpn的easyrsa,这套脚本帮我很轻松的完成了证书的签署。主要用到了build-ca build-key-server build-key,根据名字就看出来了,生成ca证书,生成服务器证书,生成私有证书。这部分根据不用的系统,生成的证书在不同的位置,详情再自行Google之。我是在openwrt上做的,签好的证书在/etc/easyrsa/keys下。

如果真心想认真学习签证书的话还是去做多点的Google吧。

证书和密钥到手,这时候比较推荐导出一下客户端证书,使用以下命令

openssl pkcs12 -export -inkey client.key -in client.crt -CAfile ca.crt -chain -out client.pfx

就能得到一份可以导入的私有证书了。(暂时我只找到这种笨办法)

 

证书都准备好之后就是服务器的配置了。

先要处理一下openssl.conf,主要是这几行

dir            = /etc/easy-rsa/keys         # top dir  
database       = $dir/index.txt          # index file.  
new_certs_dir  = $dir/newcerts           # new certs dir  

certificate    = $dir/ca.crt         # The CA cert  
serial         = $dir/serial             # serial no file  
private_key    = $dir/ca.key  # CA private key  
RANDFILE       = $dir/.rand      # random number file 

countryName = match  
stateOrProvinceName = match  
organizationName = match  
organizationalUnitName = match  
localityName            = optional  
commonName              = supplied  
emailAddress            = optional

上半部分是证书文件的位置,下半部分是认证哪些内容是相同,自己看着修改。

openssl弄好之后就是重头戏了,nginx本身的配置。

默认的配置文件里有https服务器的实例,参照着就能弄好一个认证服务器端证书的,只要稍微加上几行就能加上私有证书的认证了。

    # HTTPS server

    server {
        listen       443;
        server_name  Router;

	charset utf8;

        ssl                  on;
        ssl_certificate      /etc/easy-rsa/keys/ferrets.imzone.in.crt;
        ssl_certificate_key  /etc/easy-rsa/keys/ferrets.imzone.in.key;

	ssl_client_certificate /etc/easy-rsa/keys/ca.crt; #客户端证书认证所需要的ca证书

        ssl_session_timeout  5m;
        ssl_protocols  SSLv2 SSLv3 TLSv1;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers   on;
	ssl_verify_client on; #启用客户端证书认证

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

嗯,像上面一样的配置文件我就是做的代理服务器,转发到192.168.1.1和192.168.1.1:9091,方便远程管理路由和transmission。

感觉一下子强力了好多啊。

lighttpd上vhosts的SSL

之前因为没怎么弄懂这个,于是总是没法再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"

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

在OpenWrt上部署OpenVPN服务器

话说这标题意外的微妙呢……其实相当一段时间之前就已经弄好的,只是最新更新了trunk的固件,决定重新写一次而已。

在部署的过程中经历了不少曲折,可是最后终究还是做好了。还是外国人的东西靠谱,找到的几分中文教程里面的配置文件完全不给力啊,最后还是在官方Wiki里面找到能用的教程。

http://wiki.openwrt.org/doc/howto/vpn.openvpn

真是一份优秀的教程啊,其他平台的部署也可以略作参考。

下面是咱的人手翻译,说是这样说,其实也只是把大部分的命令弄过来而已……

—————————————–首先是服务器的配置————————————–

首先是安装软件包

opkg update
opkg install openvpn openvpn-easy-rsa

然后是稍微改一下easy-rsa的配置文件(不过如果你对手动签署证书比较熟悉的话也可以手动)

vi /etc/easy-rsa/vars

在文件底部添加环境变量

export KEY_COUNTRY="US"
export KEY_PROVINCE="TX"
export KEY_CITY="Houston"
export KEY_ORG="My Cool Place"

接着是签署证书,一共3份,根证书,服务器证书,客户证书。签署的过程需要填写一些信息,自己看着填,详细可以参考这个里面的说明
根证书

clean-all
build-ca
build-dh

服务器证书

build-key-server server

客户证书

build-key Jimmy
build-key Sara
build-key Soandso
...

将CA证书,服务器证书,dh密钥,服务器私钥拷贝到openvpn文件夹

cd /etc/easy-rsa/keys
cp ca.crt ca.key dh1024.pem server.crt server.key /etc/openvpn/

接着,把CA证书,客户端证书,dh密钥,客户端私钥拷贝到客户端。

然后,在luci(还是要有图形界面啊)的网络-接口-LAN里面,把tap0加到桥接里面,然后就不需要考虑转发啊什么的了,方便的很。

guide.openvpn.inttab

guide.openvpn.tapbridge

下面是server的配置文件,这个写在/etc/config/openvpn

config 'openvpn' 'lan'
        option 'enable' '1'
        option 'port' '1194'
        option 'proto' 'udp'
        option 'dev' 'tun0'
        option 'ca' '/etc/openvpn/ca.crt'
        option 'cert' '/etc/openvpn/server.crt'
        option 'key' '/etc/openvpn/server.key'
        option 'dh' '/etc/openvpn/dh1024.pem'
        option 'ifconfig_pool_persist' '/tmp/ipp.txt'
        option 'keepalive' '10 120'
        option 'comp_lzo' '1'
        option 'persist_key' '1'
        option 'persist_tun' '1'
        option 'status' '/tmp/openvpn-status.log'
        option 'verb' '3'
        option 'server_bridge' '192.168.1.1 255.255.255.0 192.168.1.200 192.168.1.219'

接着是防火墙啊,dhcp啊之类的,默认就可以了。

再贴一个通用版本的config,这个可以直接用openvpn来运行而不必依靠luci

port 1194
proto tcp
dev tun

### Certificate and key files
ca /etc/easy-rsa/keys/ca.crt
cert /etc/easy-rsa/keys/server.crt
key /etc/easy-rsa/keys/server.key
dh /etc/easy-rsa/keys/dh1024.pem

server 192.168.30.0 255.255.255.0
push "route 0.0.0.0 0.0.0.0"
push "dhcp-option DNS 10.1.254.250" # Change this to your router's LAN IP Address
client-to-client

### (optional) compression (Can be slow)
comp-lzo
persist-key
persist-tun

verb 3
keepalive 10 120

————————————————–接下来是客户端(OpenWrt)—————————————

配置文件:

client
tls-client
dev tun
proto tcp

remote <server address> 1194 # 改成服务器的IP
resolv-retry infinite
nobind

persist-tun
persist-key

ca ca.crt #CA证书,可以改成绝对路径,下同
cert Jimmy.crt
key Jimmy.key
dh dh1024.pem

comp-lzo
verb 3

然后可以用

openvpn --config 配置文件 --daemon

运行客户连接

另外原文还有Windows版的Client配置文件,有兴趣的可以过去看看。

又是好一阵折腾

嘛~因为开了vhosts,所以总出点什么问题……

刚刚把自己签署的证书都换了一遍,因为Google Chrome告诉我说,证书的签署算法太旧了,要被淘汰。于是又重新做了新的CA证书,然后把全部证书都重新做了一遍。中间发生了很多很多事情。

因为是签署算法的问题,所以一直在openssl里面看那些命令,不停地做,不停地做。结果最后签出来的证书都是MD5的。又尝试用DSA来做。可是用DSA做出来的根证书全部都是损坏了,不完整的,上Google搜,也没有相关的信息,结果放弃用DSA了。,老老实实用RSA。

然后又考虑是不是私钥的问题。用openssl genrsa 做了好多次,结果一旦加上什么参数就要我加上密码。我擦嘞,能不能不用密码啊,重启服务器都要输密码的话很麻烦啊。

后来翻来翻去,发现签署证书的时候,算法都是在openssl ca -md 命令里面设置的,终于找到了问题所在。 因为我是用着那个很久以前的sign.sh脚本来签署的,估计参数都在里面。然后打开一看,果真如此。改过之后再一sign,出来的就是sha1的算法,Chrome也没有报错了。于是马上动手全部换了一遍。

换了之后,问题又来了。wordpress的博客进不去了……访问的结果都是“No input file specified.”怎么改都不行,偏偏另外一个vhosts的php脚本没问题,跑phpmyadmin也没问题。php.ini的doc_root已经包括了wordpress的文件夹,可是还是不行。最后一怒之下,把doc_root给注释了,结果就好了……

今天意外多折腾啊

[转载]全球可信并且唯一免费的HTTPS(SSL)证书颁发机构:StartSSL

[文章作者:张宴 本文版本:v1.0 最后修改:2009.11.14 转载请注明原文链接:http://blog.s135.com/startssl/]

HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容请看SSL。

它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。这个系统的最初研发由网景公司进行,提供了身份验证与加密通讯方法,现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。

1、自行颁发不受浏览器信任的SSL证书:
HTTPS的SSL证书可以自行颁发,Linux下的颁发步骤如下:

openssl genrsa -des3 -out api.bz.key 1024
openssl req -new -key api.bz.key -out api.bz.csr
openssl rsa -in api.bz.key -out api.bz_nopass.key

Nginx.conf的SSL证书配置,使用api.bz_nopass.key,在启动Nginx是无需输入SSL证书密码,而使用api.bz.key则需要输入密码:

server
{
server_name sms.api.bz;
listen 443;
index index.html index.htm index.php;

root /data0/htdocs/api.bz;

ssl on;
ssl_certificate api.bz.crt;
ssl_certificate_key api.bz_nopass.key;
......
}

自行颁发的SSL证书虽然能够实现加密传输功能,但得不到浏览器的信任,会出现以下提示:

2、受浏览器信任的StartSSL免费SSL证书: 继续阅读

为luci添加HTTPS验证

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

以下是参考书:
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: [email protected] 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来访问自己的路由吧~