startssl 的密钥认证登录是如何实现的?

2015-01-11 00:35:09 +08:00
 Draplater

auth.startssl.com里使用了密钥认证登录,需要事先向浏览器中导入私钥,然后利用这个密钥来认证。这比口令认证安全得多。web上使用这种认证方式我还是第一次见。
这种接口叫什么名字?是怎么实现的?我可以用常用的web服务器实现吗?

5840 次点击
所在节点    问与答
37 条回复
xoxo
2015-01-11 00:38:12 +08:00
SSL双向认证, 好像必须CA才可以不装控件实现
NeoAtlantis
2015-01-11 00:45:52 +08:00
就是ssl要求客户端证书的情况。你可以配置服务器启动要求客户端证书。还可以要求客户端证书是通过哪个CA颁发的,比如你颁发(给服务器配置你的CA的证书),或者一个其他的CA(比如startssl签署的电子邮件的认证)颁发的。
NeoAtlantis
2015-01-11 00:47:05 +08:00
而且我认为这种认证虽然比口令安全,但是浏览器上的私钥如果没被好好加密,并不安全。比如你导入私钥到浏览器之后,每次使用的时候要输入主密码吗?没有的话私钥就是明文放着的。我建议配合一个密码登录。
azuis
2015-01-11 01:07:28 +08:00
其实支付宝数字证书也是一个原理啊。只不过装控件的时候强行给你装了他们的CA。如果你是CA就可以签发SSL 客户端证书用来认证。
vibbow
2015-01-11 02:00:53 +08:00
@xoxo CA和装不装控件没关系。
装控件只是为了客户端没有密钥的时候不会直接抛出一个安全协商失败的错误。
vibbow
2015-01-11 02:02:28 +08:00
@NeoAtlantis 有种东西叫U盾...
xoxo
2015-01-11 02:34:42 +08:00
@vibbow 不可能. 证书如果不受信任, 怎么添加进浏览器个人证书区. 所以CA还是有必要的,否则你无法给你自己的用户随时随地签发证书。
orzfly
2015-01-11 02:42:14 +08:00
@xoxo 浏览器会自动让你信任 CA……
vibbow
2015-01-11 03:01:36 +08:00
@xoxo 如果你用硬件数字证书的话,导入证书时可以同时导入证书链,也可以选择不导入证书链。
浏览器使用一个自签名的证书给服务器,是否信任这个证书是服务器的选择。
服务器可以要求这个客户端证书必须是由可信CA颁发的,也可以选择接受任何证书。
vibbow
2015-01-11 03:02:53 +08:00
@xoxo 对于服务器端对客户端的证书认证,既可以在Apache的层面上完成,也可以在PHP的层面上完成。
vibbow
2015-01-11 03:09:33 +08:00
@Draplater 对于Apache,LZ可以参考这篇文章来配置
http://vsean.net/blog/post/194
NeoAtlantis
2015-01-11 03:40:59 +08:00
@vibbow u盾是干嘛的?
vibbow
2015-01-11 03:59:22 +08:00
@NeoAtlantis 保存数字证书用的。
私钥只可以导入,不可以导出。
密码输入错误达到一定次数后自动重置。
NeoAtlantis
2015-01-11 06:27:55 +08:00
@vibbow 也就是说使用私钥进行的操作(解密或者签名)也必须在U盾中进行了?
vibbow
2015-01-11 06:38:47 +08:00
vibbow
2015-01-11 06:49:04 +08:00
@NeoAtlantis 我对具体实现的细节不是很了解。
但是感觉上是:是的。
0okmnbvcxzx
2015-01-11 07:01:20 +08:00
@NeoAtlantis Linux怎么处理的我不知道,但Windows应该是存储在用户配置里并且用用户密码有关的密钥加密的,如果你的电脑可能被人乱动你不会不设密码吧,一般这就够了。

@vibbow 总觉得支付宝是为了以它不标准的方式完成验证……


@xoxo 只需要证书有验证客户端的属性并且在服务器上配置就行了。
0okmnbvcxzx
2015-01-11 07:05:29 +08:00
最简单的实现方式是IIS6下将客户端证书与本地用户关联
vibbow
2015-01-11 07:38:46 +08:00
@0okmnbvcxzx 支付宝那就是纯粹的耍流氓。
NeoAtlantis
2015-01-11 09:09:57 +08:00
@0okmnbvcxzx Windows怎么实现的我不知道,我印象中Windows的有关用户身份的文件可能难以访问,换句话说是权限控制。加密就不知道了。但是导入到Firefox或者Chrome的证书是导入到证书管理器,应该是浏览器自己维护的。而证书私钥在客户端里面的加密存储这个要求,我的理解是类似PIN,将使用者人的身份和密码机制绑定起来,是必要的。但是我所用过的情况,导入证书需要密码,使用不需要(在浏览器没有主密码时)。这样说来浏览器很不可能加密过证书。

@vibbow 让我看的微软的CSP是一套加密服务吧,包括对称加密什么的算法都可以从它调用,似乎类似OpenSSL的功能。但是OpenSSL据我所知没有操作智能卡的功能,GnuPG有。智能卡能否在芯片上完成签名和解密是很重要的。否则就必然要把私钥交给电脑。就算是银行的U盾,密码也在电脑上进行了输入(弹出对话框要求输入U盾密码),也是个设计的弱点(比如键盘记录器什么的)。

而且说回到浏览器,浏览器就算启用了主密码,我也不知道这个主密码是怎么加密密钥库的,因为人设定的口令一般比较弱,应该要求使用PBKDF2/bcrypt/scrypt来迭代拖延时间,避免回头用暴力破解挨个尝试(AES这种加密函数甚至比散列函数算起来还要快)。所以如果直接拿主密码加密一个密钥,也是个弱点(不光说是浏览器)。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/161018

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX