`
lykops
  • 浏览: 86205 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

如何构建私有公钥基础设施

 
阅读更多

相当复杂的现代Web服务大多数都不是由单体应用提供。为了处理复制的操作,应用程序通常被分解成许多服务,分别处理业务逻辑或数据存储的不同部分。这些服务可能部署在不同的机器甚或是不同的数据中心。在CloudFlare,随着服务的增加,应用程序之间安全通信的需求也在增长。他们需要一种简单、可维护的方法来确保CloudFlare内部服务之间的所有通信都始终处于安全保护之下。因此,他们基于已知且可靠的协议构建了一个这样的系统。该系统基于一个“公钥基础设施(public key infrastructure,缩写为PKI)”,使用了内部托管的认证中心(CA)。近日,CloudFlare系统工程师Nick Sullivan介绍了私有PKI构建过程和内部使用方式。

他们的方法是所有的新服务都使用一种同加密协议——传输层安全(TLS)协议——保护服务间通信。这是一种很自然的选择:HTTPS中的“S”就是TLS,它是Web加密的基础。而且,现代Web服务和API均以TLS作为应用层加密事实上的标准。它可以与RESTful服务无缝集成,并获得了Kyoto TycoonPostgreSQL和Go标准库的支持。另外,Nick在先前发表的一篇文章中讨论过,未经身份验证的加密可能遭受中间人攻击。也就是说,加密但不做身份验证无法在传输中保护数据。为了连接安全,每个连接方都必须向另一方提供身份标识。公钥加密技术提供了许多种信任机制,包括PGP的“信任网络(web of trust)”和HTTPS的公钥基础设施模型。由于更易于使用和部署,他们选择了PKI,由它和TLS一起提供可信任的通信。

PKI借助数字证书和公钥加密技术提供可信任的网络身份。通常,证书就是一个包含如下身份信息的文件:

  • 证书所有组织的信息
  • 公钥
  • 证书颁发组织的信息
  • 证书颁发组织授予的权限,如证书有效期、适用的主机名、用途等
  • 使用证书颁发组织私钥创建的数字签名

每个公钥都有一个对应的私钥,后者在证书所有者的管控之下,可以用于对数据进行数字签名,验证器可以使用证书中的公钥对数据进行验证。如果证书本身包含第三方认证中心的数字签名,那么只要验证器信任该第三方,就可以确保证书是合法的。有时候,证书是由中介认证中心签名,而中介认证中心的证书又是由不同的认证中心签名。在这种情况下,证书验证器会沿着这条链一直找到它信任的证书。对于认证中心而言,信任链模型非常有用,它允许我们将根证书的私钥离线存储,只为中介证书签名。中介认证中心的正式存在时间较短, 可以为端点证书签名。

这与Web上HTTPS使用的系统相同。但对于不需要通过浏览器访问的内部服务,就没有必要通过第三方认证中心。也就是说,受信任证书不必由GlobalsignComodoVerisign或其它认证中心颁发,它们可以由你自己的CA颁发。

创建自己的认证中心(CA)

为了创建一个可以轻松获取和操作证书的内部认证中心,他们使用了自己开源的PKI工具箱CFSSL。该工具具有运行一个认证中心所需的全部功能。虽然CFSSL是为运行内部CA而创建,但它足够健壮,可以用于公开的受信任CA。实际上,Let’s Encrypt项目就使用CFSSL作为CA基础设施的一个核心部件。

运行认证中心需要一个CA证书和相应的私钥。后者是极其敏感的数据。任何知道私钥的人都可以充当CA颁发证书。因此,私钥的保护至关重要。CFSSL支持以下三种私钥保护模式:

接下来,我们将沿着Nick的思路看下如何使用纯文本私钥快速配置一个内部CA。

生成CA证书和私钥

创建一个包含如下组织基本信息的文件csr_ca.json

{
  "CN": "My Awesome CA",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
    "names": [
       {
         "C": "US",
         "L": "San Francisco",
         "O": "My Awesome Company",
         "OU": "CA Services",
         "ST": "California"
       }
    ]
}

执行下面的命令:

$ cfssl gencert -initca csr_ca.json | cfssljson -bare ca

该命令会生成运行CA所必需的文件ca-key.pem(私钥)和ca.pem(证书),还会生成ca.csr(证书签名请求),用于交叉签名或重新签名。

配置证书生成策略,并启动CA服务

配置证书生成策略,让CA软件知道颁发什么样的证书。下面是一个简单的示例:

config_ca.json  
{
  "signing": {
    "default": {
      "auth_key": "key1",
      "expiry": "8760h",
      "usages": [
         "signing",
         "key encipherment",
         "server auth"
       ]
     }
  },
  "auth_keys": {
    "key1": {
      "key": <16 byte hex API key here>,
      "type": "standard"
    }
  }
}

该策略指定了证书有效期(1年)、用途(服务器验证等)以及一个随机生成的私有验证密钥。该密钥可以防止未经授权的机构请求证书。

执行下面的命令,启动CA服务:

$ cfssl serve -ca-key ca-key.pem -ca ca.pem -config config_ca.json

证书生成与签名

截止目前,基于CFSSL的CA已经配置完成,不妨假设它运行在服务器“ca1.mysite.com”上。该CA如何颁发证书呢?CFSSL提供了两个命令:gencertsigngencert将自动处理整个证书生成过程。该过程需要两个文件,一个告诉CFSSL本地客户端CA的位置以及如何验证请求,另一个为CSR配置信息,用于填充CSR。下面是为一个为数据库服务db1.mysite.com创建证书的例子:

config_client.json

{
  "signing": {
    "default": {
      "auth_key": "key1",
      "remote": "caserver"
    }
  },
  "auth_keys": {
    "key1": {
    "key": <16 byte hex API key here>,
    "type": "standard"
    }
  },
  "remotes": {
    "caserver": “ca1.mysite.com:8888"
  }
}

csr_client.json

{
  "hosts": [
        "db1.mysite.com"
  ],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "US",
      "L": "San Francisco",
      "O": “My Awesome Company",
      "OU": “Data Services",
      "ST": "California"
    }
  ]
}

有了这两个文件就可以使用下面的命令为数据库服务器db1.mysite.com创建证书了:

$ cfssl gencert -config config_client.json csr_client.json | cfssljson -bare db

前面已经提到过,该命令会生成三个文件,其中db-key.pemdb.pemdb.csr,其中db.csr可以再次提交给CA,使用sign命令重新签名:

$ cfssl sign -config config_client.json db.csr | cfssljson -bare db-new

该命令会生成新证书db-new.pem。这两个命令使私有PKI搭建变得非常容易和便利。

使用PKI

为应用程序生成证书和密钥有两种方式:集中式和分布式。前者是指预先配置好一台中央服务器,由它创建所有的证书并发送给每台应用程序服务器;后者是指由应用服务器创建自己的私钥,并向验证中心发送证书申请。按照Nick的说法,在第一种方式中,中央服务器管理复杂,而且向应用服务器传输私钥会引入不必要的风险。相比之下,第二种方式可以按需申请证书,非常易于扩展。

确立服务之间的信任关系

浏览器通过检查证书签名以及根据“主题备用名称(Subject Alternative Names,缩写为SAN)”列表检查主机名来验证网站证书。这种显式检查有用,但可能会出现不正常情况。另一种使服务相互信任的方式是基于单服务CA的隐式检查,其思想很简单:每组服务使用不同的CA。比如,由数据库CA颁发所有数据库的证书,由API服务器CA颁发所有API服务器的证书。

当这些服务彼此间使用相互TLS验证进行通信时,将信任关系配置为:

  • API服务器只信任DB CA
  • DB服务器只信任API CA

配置完成后,A类型的服务将只能和B类型的服务通信。下图描述了两个应用程序如何使用相互TLS验证确立相互信任关系:

如上图,API 服务器信任DB CA(红色)。因此,它只接受由DB CA(带红丝带)签名的证书。反之,数据库服务器只接受由API CA(带橙丝带)签名的证书。为了建立一个受信任连接,双方互相发送一个“密钥共享(key share)”,并用它们的私钥签名。密钥共享合并到一起创建一个会话密钥,会话双方用它加密数据。

将PKI用于远程服务

内部PKI非常灵活,可以用于向集成到PKI所在网络的第三方发放证书。例如,CloudFlare有一个名为Railgun的服务,可以用于优化CloudFlare与源服务器的连接。Railgun与CloudFlare之间的通信就是使用CloudFlare认证中心颁发的证书进行加密与身份验证。这可以确保数据传输安全。

小结

实现应用程序层数据安全是确保分布式系统架构安全的重要一步,但只有在有一个强大的PKI时才能实现真正有效的安全防护。


原文地址:http://www.infoq.com/cn/news/2015/06/CloudFlare-PKI-TLS?utm_source=news_about_CFSSL&utm_medium=link&utm_campaign=CFSSL

分享到:
评论

相关推荐

    公钥基础设施系统运行维护管理规定.zip

    公钥基础设施(Public Key Infrastructure,简称PKI)是一种基于加密技术的网络安全体系,它通过数字证书、证书权威机构(CA)、密钥管理等组件,确保网络通信的安全性和数据的完整性。"公钥基础设施系统运行维护...

    网络游戏-基于公钥基础设施的网络信息内容分级管理方法.zip

    《网络游戏-基于公钥基础设施的网络信息内容分级管理方法》是一个深入探讨网络安全和信息管理的专题,特别是针对网络游戏环境下的应用。在这个主题中,我们主要关注的是如何利用公钥基础设施(PKI)来实现网络信息...

    Isis PKI and Keystore Service:公钥基础设施和 Java 密钥存储-开源

    Isis PKI 和密钥库服务提供完整的 PKI 服务,用于创建、存储和管理 RSA 私有/公共密钥和证书以及对称密钥。 Isis 可以管理多个密钥存储文件和一个保存在嵌入式 H2 数据库中的内部默认存储。 然后,可以使用Isis Java...

    公开密钥基础设施PKI介绍.pptx

    公开密钥基础设施(PKI,Public Key Infrastructure)是一种用于建立网络信任基础的重要技术,它主要依靠公钥加密技术和数字证书来确保数据的机密性、完整性和可鉴别性。PKI的核心组件包括认证权威机构(CA,...

    11基于陷门置换的公钥加密.docx-Doneh:Cryptography

    总的来说,基于陷门置换的公钥加密为分布式和互联网环境提供了基础安全设施,使得不信任的网络中也能实现安全通信。其核心在于公钥/私钥对的使用,以及确保即使在密钥被多次使用的情况下,仍然能抵御各种形式的攻击...

    公钥密码术:理论与实践(Bodo Moeller)Public-Key Cryptography: Theory and Practice (Bodo Moeller)

    例如,公钥基础设施(PKI)就是一个实际应用公钥密码学的系统,它通过数字证书来管理公钥的分发,使用户能够验证对方的身份,并安全地进行通信。本书会对PKI系统进行详细介绍,并探讨在实施过程中可能遇到的安全问题...

    RSA算法C++实现

    【公钥基础设施PKI】随着电子商务和互联网应用的发展,公钥基础设施(PKI)成为保障信息安全的重要工具。PKI基于公钥加密算法,如RSA,提供证书认证、数字签名和密钥管理等功能,广泛应用于服务器认证、电子邮件加密...

    epass1000 开发工具包

    这个工具包旨在帮助开发者利用ePass1000这款硬件安全模块(HSM)进行PKI(公钥基础设施)应用的集成和开发。在描述中提到,该工具包包含了多种编程语言的示例,如VB(Visual Basic)和C#,这表明它具有良好的跨平台...

    密码学基础-密码学基础

    五、公钥基础设施(PKI) PKI是基于非对称加密的一种体系,用于管理和验证数字证书。它包括证书颁发机构(CA)、注册机构(RA)、证书存储库和证书撤销列表(CRL)。PKI的核心是信任模型,通过CA的签名来验证证书...

    基于云计算的智能化税务信息管理平台构建.pdf

    PKI(Public Key Infrastructure,公钥基础设施)是一种利用公钥加密技术为网络平台提供安全基础平台的技术和规范。PKI技术遵循国际标准和RFC文档,在各种成熟算法和协议的基础上,为用户提供完整的网络信息系统安全...

    现代密码学原理与实践.zip

    这章会介绍公钥基础设施(PKI)、数字签名以及证书权威机构(CA)的角色。 4. **第4章 - 哈希函数与消息摘要** 哈希函数在密码学中用于验证数据完整性,如MD5和SHA系列。本章将解释哈希函数的特性,如抗碰撞性和不...

    IBC密码体系与应用

    1984年,Adi Shamir提出了基于标识的密码技术(IBC),这是一种创新的密码学概念,它简化了传统公钥基础设施(PKI)中的证书管理,将用户的公钥直接与他们的身份或角色关联,无需证书交换。2000年后,基于椭圆曲线的...

    pki教程 信息安全技术

    【描述】:“PKI技术教程,基础设施就是一个普适性基础,它在一个大环境里起着基本框架的作用,作为基础设施,需要实现‘应用支撑’的功能,可以让‘应用’正常工作。” 【标签】:“pki” 【正文】: PKI,全称...

    南京邮电大学-课程实验-密码学-实验报告和源码说明.zip

    它们可能包含了密码学的基础概念,如对称加密(如DES、AES)、非对称加密(如RSA、ECC)、哈希函数(如MD5、SHA系列)以及数字签名和公钥基础设施(PKI)等主题。通过解答这些题目,学生可以巩固理论知识,并提高...

    Cryptography-master.zip

    公钥基础设施(PKI)则是一种系统,包括证书颁发机构(CA)、注册机构(RA)等,用于管理和验证公钥的合法性。 七、密码学应用 在现实生活中,密码学广泛应用于网络通信(如HTTPS)、电子支付(如SSL/TLS协议)、...

    [价值550元新版CIW网络工程师V3.0chinaitlab网校课程].pki.rar

    总结来说,"[价值550元新版CIW网络工程师V3.0chinaitlab网校课程].pki.rar"是一个涵盖全面网络知识,特别是公钥基础设施(PKI)的高价值在线课程,对于想要深入学习网络技术,尤其是网络安全性的人来说,是一个非常...

    企业私有云的建立—基于Ubuntu_Enterprise_Cloud

    Ubuntu Enterprise Cloud (UEC) 是一个基于开源Eucalyptus平台的企业级云计算解决方案,它允许企业在内部数据中心构建与Amazon Web Services (AWS) 兼容的基础设施即服务(IaaS)环境。本教程将详细介绍如何在Ubuntu ...

    北京邮电大学密码学课件

    2. **证书与证书权威机构(CA)**:公钥基础设施中的重要组成部分,验证网络实体的身份,保证通信双方的安全连接。 3. **加密硬盘与全盘加密**:保护存储设备上的数据安全,即使设备丢失或被盗,数据也无法被轻易...

    《经典密码学与现代密码学》配套软件CAP

    现代密码学则涵盖了更广泛的主题,包括对称加密(如DES、AES)、非对称加密(如RSA、ECC)、哈希函数(如MD5、SHA系列)以及数字签名和公钥基础设施(PKI)等。 1. 对称加密:CAP软件可能会提供对称加密算法的实现...

Global site tag (gtag.js) - Google Analytics