V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Draplater
V2EX  ›  问与答

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

  •  
  •   Draplater · 2015-01-11 00:35:09 +08:00 · 6035 次点击
    这是一个创建于 3630 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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


    @xoxo 只需要证书有验证客户端的属性并且在服务器上配置就行了。
    0okmnbvcxzx
        18
    0okmnbvcxzx  
       2015-01-11 07:05:29 +08:00 via Android
    最简单的实现方式是IIS6下将客户端证书与本地用户关联
    vibbow
        19
    vibbow  
       2015-01-11 07:38:46 +08:00
    @0okmnbvcxzx 支付宝那就是纯粹的耍流氓。
    NeoAtlantis
        20
    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这种加密函数甚至比散列函数算起来还要快)。所以如果直接拿主密码加密一个密钥,也是个弱点(不光说是浏览器)。
    TrustyWolf
        21
    TrustyWolf  
       2015-01-11 09:18:48 +08:00
    要是以后所有的登陆操作都用一个U盾解决就好了,要登陆的时候直接插U盾...
    yushiro
        22
    yushiro  
       2015-01-11 09:46:54 +08:00 via iPhone
    正好搭车问一下楼主,怎么在mac里面导出startssl的登录证书?我要导入到win7的chrome中。
    现在遇到的问题是,私钥导出后无法导入,报错说格式不正确(文件后缀p12)公钥和email证书可以导入,但是无法登陆startssl
    vibbow
        23
    vibbow  
       2015-01-11 10:05:32 +08:00
    @NeoAtlantis Chrome@Windows是用Windows的证书数据库的
    Firefox是自己维护了一套证书数据库的

    https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/tools/NSS_Tools_certutil
    看起来Firefox的证书/私钥库默认是非加密的,保存在 cert8.db key3.db 里

    等下我看看飞天的SDK,他们在私钥解密上是怎么做的。
    vibbow
        24
    vibbow  
       2015-01-11 10:10:14 +08:00
    @NeoAtlantis 飞天的SDK是提供了中间件的binary文件。
    然后给了头文件,通过WINDOWS CSP API或者PCKS#11 API去操作数字证书。。。
    vibbow
        25
    vibbow  
       2015-01-11 10:28:32 +08:00   ❤️ 1
    @NeoAtlantis 大概研究了一下。
    结论如下:
    目前来说,对硬件数字证书的操作,需要通过CSP API或者PCKS#11 API去操作。
    应用程序没有直接去操作硬件数字证书的能力。(或者说只是不知道怎么去直接操作硬件)
    CSP API和PCKS#11 API的中间件由数字证书厂家制作,没有公开源代码(或者我没找到)。

    所以数字证书的私钥有没有释放给windows,那就要看硬件数字证书厂家对中间件的实现了。


    按照我目前的经验:
    对于使用CSP API的程序,操作数字证书的session在不同程序之间是不共享的(比如说我在IE里登陆了硬件数字证书,在Outlook需要使用硬件数字证书的话需要另外登陆,不能共享IE里的session)。至于其他程序能不能通过读内存的方式获取到已有的session,这个就不知道了,不过感觉Windows应该会有相关的内存保护措施吧。

    对于PCKS#11 API的程序,那就真的看程序自己的实现了。像Firefox在一段时间内不操作数字证书(这个时间很短,几分钟的样子),就会要求重新登陆硬件数字证书(说明firefox并没有在内存里保存硬件数字证书的登陆密码?)。不过我相信其他程序绝对有能力注入Firefox的进程获取到一部分信息,具体多少?我不知道。
    vibbow
        26
    vibbow  
       2015-01-11 10:31:56 +08:00
    @NeoAtlantis 所以硬件数字证书的优点之一就是:用完之后就可以拔掉......
    智能卡同理。
    0okmnbvcxzx
        27
    0okmnbvcxzx  
       2015-01-11 10:52:22 +08:00 via Android
    @NeoAtlantis windows 的私钥文件是可以直接访问的,chrome用的是用户在系统中的存储区,没有独立的存储。Firefox我不了解,但估计验证时也是读取用户自己的存储区吧(内置的大概不派这用场。
    如果你需要每次使用都要密码可以启用强私钥保护,可以每次使用私钥都要密码解密。
    之前我说加密是想着强制重设密码后私钥会失效,现在想想理由不足,想知道一般加不加密得export一下了。


    @vibbow 唉,国内的都这副德行。。还是PayPal大法好
    NeoAtlantis
        28
    NeoAtlantis  
       2015-01-11 11:11:33 +08:00 via Android
    @vibbow 从你的说法看是挺像没有给操作系统。PBKS#11好像本身就是一套复杂的操作标准什么的。话说那么硬件对导入的证书、解密的密文所用的算法、签名算法有限制沒?比如什么算法,多少比特? 硬件能支持的应该有些限制?
    vibbow
        29
    vibbow  
       2015-01-11 11:14:41 +08:00
    @NeoAtlantis 有限制。
    这是我用的硬件数字证书的技术参数:
    http://www.ftsafe.com/product/epass/epass3003auto
    vibbow
        30
    vibbow  
       2015-01-11 11:16:07 +08:00
    @0okmnbvcxzx 我被Paypal莫名其妙封了一个账号,然后他们发邮件让我重新注册一个...
    NeoAtlantis
        31
    NeoAtlantis  
       2015-01-11 11:23:38 +08:00 via Android
    @vibbow 可惜了啊,看来是不错,但是算法略旧的感觉…RSA到2048,DES和3DES也挺旧,SHA256还好。
    0okmnbvcxzx
        32
    0okmnbvcxzx  
       2015-01-11 18:18:42 +08:00 via Android
    @vibbow 有联系过客服吗?他们怎么说……是无解了吗?
    GhostFlying
        33
    GhostFlying  
       2015-01-11 22:21:15 +08:00
    vibbow
        34
    vibbow  
       2015-01-11 22:24:09 +08:00
    @0okmnbvcxzx 就是客服给我说让我重新申请一个账号...
    vibbow
        35
    vibbow  
       2015-01-11 22:27:40 +08:00
    @NeoAtlantis 就算是目前最好的SafeNet的,也只不过是多支持了一个AES256的而已。
    ftsafe的其实还支持国密算法,只不过英文页面没写而已。
    vibbow
        36
    vibbow  
       2015-01-11 23:36:20 +08:00
    @GhostFlying 一个yubico卖的比U盾还贵,看得我也是醉了。
    0okmnbvcxzx
        37
    0okmnbvcxzx  
       2015-01-12 13:09:22 +08:00 via Android
    @vibbow 真是个悲伤的故事……
    国密的话除了有关部门应该很少用吧……
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1463 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 17:09 · PVG 01:09 · LAX 09:09 · JFK 12:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.