zoukankan      html  css  js  c++  java
  • SSL的OpenSSL实现

    零、前言

    自译整理,转载表明出处。
    原文链接:https:////www.cnblogs.com/Yogile/p/12483021.html
    英文原文档链接:https://help.ubuntu.com/community/OpenSSL

    一、介绍

    本指南旨在向读者介绍安全套接字层(SSL)应用程序级协议,尤其是SSL的OpenSSL实现。在简要说明了什么是OpenSSL及其有用之处之后,该指南将进一步说明OpenSSL在客户端-服务器环境中的实际用法,并提供可能受益于OpenSSL的应用程序的特定示例。最后,该指南将引导用户完成将OpenSSL与流行的Apache超文本传输协议(HTTP)服务器一起使用以从Ubuntu计算机提供安全网页的目的所需的示例过程。

    • 提前安装好 OpenSSL 包:

      sudo apt-get install openssl
      

    二、SSL证书

    本指南的以下各节将介绍与SSL证书的生成和使用有关的概念,包括自签名品种和由公认的证书颁发机构签名的,与支持SSL的服务器应用程序一起使用的证书以及X的使用。客户端应用程序中的509个证书。

    (一)服务器使用的SSL证书

    1. 生成并签署自签名证书

    自签名证书的主要优点在于,它们完全可以免费使用,并且可以根据需要生成,签名和使用。自签名证书非常适合在封闭实验室环境中使用或用于测试目的。但是,使用自签名证书的缺点之一是,当访问使用自签名证书的受SSL保护的服务器时,警告通常由用户的Web浏览器和其他应用程序发出。默认情况下,客户端应用程序(例如 Firefox)将对仅使用全球认可和受信任的证书颁发机构签名的证书禁止显示此类警告,但也可以通过将服务器的根证书导入客户端应用程序来消除警告。本指南后面将显示相关的演示。不建议在可公开访问的生产环境中使用自签名证书,这是由于这些警告引起的隐式信任问题,以及对用户造成的潜在混乱。

    注意:您必须获得由公认的证书颁发机构签署的证书,才能建立商业站点,例如进行“电子商务”。

    如果您以前已经按照上述说明安装了OpenSSL工具包,则X.509 SSL证书的生成非常简单。对于自签名证书,必须首先按照以下步骤建立证书颁发机构(CA):

    2. 创建证书颁发机构

    • 首先,例如在主目录中,通过从终端提示符处发出以下命令来创建一个初始工作环境:

      cd && mkdir -p myCA/signedcerts && mkdir myCA/private && cd myCA
      

      在此初始工作环境中,子目录的重要性及其内容如下:

      ~/myCA : 包含CA证书,证书数据库,生成的证书,密钥和请求
      
      ~/myCA/signedcerts : 包含每个签名证书的副本
      
      ~/myCA/private : 包含私钥
      
    • 接下来,在终端提示符下,使用以下命令在~/myCA子目录中创建初始证书数据库:

      echo '01' > serial  && touch index.txt
      
    • 现在创建适合于创建CA证书的初始caconfig.cnf文件。使用您喜欢的编辑器,编辑文件~/myCA/caconfig.cnf,并将以下内容插入文件:

      sudo vim ~/myCA/caconfig.cnf
      
      # My sample caconfig.cnf file.
      #
      # Default configuration to use when one is not provided on the command line.
      #
      [ ca ]
      default_ca      = local_ca
      #
      #
      # Default location of directories and files needed to generate certificates.
      #
      [ local_ca ]
      dir             = /home/<username>/myCA
      certificate     = $dir/cacert.pem
      database        = $dir/index.txt
      new_certs_dir   = $dir/signedcerts
      private_key     = $dir/private/cakey.pem
      serial          = $dir/serial
      #       
      #
      # Default expiration and encryption policies for certificates.
      #
      default_crl_days        = 365
      default_days            = 1825
      default_md              = sha1
      #       
      policy          = local_ca_policy
      x509_extensions = local_ca_extensions
      #
      #
      # Copy extensions specified in the certificate request
      #
      copy_extensions = copy
      #       
      #
      # Default policy to use when generating server certificates.  The following
      # fields must be defined in the server certificate.
      #
      [ local_ca_policy ]
      commonName              = supplied
      stateOrProvinceName     = supplied
      countryName             = supplied
      emailAddress            = supplied
      organizationName        = supplied
      organizationalUnitName  = supplied
      #       
      #
      # x509 extensions to use when generating server certificates.
      #
      [ local_ca_extensions ]
      basicConstraints        = CA:false
      #       
      #
      # The default root certificate generation policy.
      #
      [ req ]
      default_bits    = 2048
      default_keyfile = /home/<username>/myCA/private/cakey.pem
      default_md      = sha1
      #       
      prompt                  = no
      distinguished_name      = root_ca_distinguished_name
      x509_extensions         = root_ca_extensions
      #
      #
      # Root Certificate Authority distinguished name.  Change these fields to match
      # your local environment!
      #
      [ root_ca_distinguished_name ]
      commonName              = MyOwn Root Certificate Authority
      stateOrProvinceName     = NC
      countryName             = US
      emailAddress            = root@tradeshowhell.com
      organizationName        = Trade Show Hell
      organizationalUnitName  = IT Department
      #       
      [ root_ca_extensions ]
      basicConstraints        = CA:true
      

      重要提示:务必调整明显的部位,具体细节在文件中,如两个实例[ local_ca ][ req ] 下的 /home/<username>/ 。还可以在[root_ca_distinguished_name]下更改 commonName, stateOrProvinceName countryName等以针对您的环境进行个性化设置。有关此配置文件中包含的指令的更多信息,请使用man config命令。

      编辑文件以适合您的环境后,将文件另存为 ~/myCA/caconfig.cnf

    • 接下来,您需要通过发出一些命令来生成证书颁发机构根证书和密钥。首先,执行以下操作:

      export OPENSSL_CONF=~/myCA/caconfig.cnf
      

      前面的命令设置一个环境变量OPENSSL_CONF,该变量强制openssl工具在备用位置(在本例中为 ~/myCA/caconfig.cnf )中查找配置文件。

      现在,使用以下命令生成CA证书和密钥:

      openssl req -x509 -newkey rsa:2048 -out cacert.pem -outform PEM -days 1825
      

      应该提示您输入密码,并看到类似以下的输出:

      Generating a 2048 bit RSA private key
      .................................+++
      .................................................................................................+++
      writing new private key to '/home/bshumate/myCA/private/cakey.pem'
      Enter PEM pass phrase:
      Verifying - Enter PEM pass phrase:
      -----
      

      不要忘记上面命令使用的密码!每当您要生成并签署新的服务器或客户端证书时,都将需要它!

      上面的过程将使用PEM格式和RSA公/私钥加密创建自签名证书。该证书有效期为1825天。结果文件的位置和目的如下:

      ~/myCA/cacert.pem : CA公共证书
      
      ~/myCA/private/cakey.pem : CA私钥
      

    3. 可选步骤

    • 从其所有文本中剥离证书,仅保留-CERTIFICATE-部分以创建crt

      openssl x509 -in cacert.pem -out cacert.crt
      

    4. 创建自签名服务器证书

    现在,您已经配置了证书颁发机构,可以使用它来签署自签名证书。在开始以下步骤之前,您可能希望使用密码对证书的私钥进行加密。使用密码短语加密密钥的优点包括在证书被盗时保护证书。

    每次启动启用SSL的应用程序时,如果不输入密码,该证书就不能与启用SSL的应用程序一起使用。这种情况虽然是最安全的,但可能会引起问题:如果必须像无人值守的方式(如计算机重新启动一样)启动服务器,则没有人可以输入密码,随后服务器将无法启动。消除这种情况的一种方法涉及安全性的折衷:可以解密密钥,以消除密码短语的必要性;因此,启用SSL的应用程序将自动启动,而无需您输入密码。

    要实际生成用于SSL应用程序的自签名证书,请遵循以下过程:

    • 通过使用您喜欢的文本编辑器编辑 ~/myCA/exampleserver.cnf 来创建服务器配置文件。添加此示例内容:

      #
      # exampleserver.cnf
      #
      
      [ req ]
      prompt                  = no
      distinguished_name      = server_distinguished_name
      req_extensions          = v3_req
      
      [ server_distinguished_name ]
      commonName              = tradeshowhell.com
      stateOrProvinceName     = NC
      countryName             = US
      emailAddress            = root@tradeshowhell.com
      organizationName        = My Organization Name
      organizationalUnitName  = Subunit of My Large Organization
      
      [ v3_req ]
      basicConstraints        = CA:FALSE
      keyUsage                = nonRepudiation, digitalSignature, keyEncipherment
      subjectAltName          = @alt_names
      
      [ alt_names ]
      DNS.0                   = tradeshowhell.com
      DNS.1                   = alt.tradeshowhell.com
      

      确保更改server_distinguished_name下的值,尤其是commonName值。该commonName值必须与主机名匹配,或CNAME主机要使用的关键。如果commonName与预期的主机名不匹配,则主机/证书不匹配错误将出现在尝试访问服务器的客户端的客户端应用程序中。

    • 正确编辑文件后,将其另存为 ~/myCA/exampleserver.cnf 。生成服务器证书,并使用以下命令进行密钥:

      export OPENSSL_CONF=~/myCA/exampleserver.cnf
      

      上一条命令设置了一个环境变量OPENSSL_CONF,该变量强制openssl工具在备用位置(在本例中为~/myCA/exampleserver.cnf)中查找配置文件。

    • 现在生成证书和密钥:

      openssl req -newkey rsa:1024 -keyout tempkey.pem -keyform PEM -out tempreq.pem -outform PEM
      

      应该提示您输入密码,并看到类似以下的输出:

      Generating a 1024 bit RSA private key
      ...++++++
      ...............++++++
      writing new private key to 'tempkey.pem'
      Enter PEM pass phrase:
      Verifying - Enter PEM pass phrase:
      -----
      

      不要忘记密码!

    • 接下来,您可以使用以下命令将临时私钥转换为未加密的密钥:

      openssl rsa < tempkey.pem > server_key.pem
      

      应该提示您输入上面使用的密码,并查看以下输出:

      Enter pass phrase:
      writing RSA key
      

      如果您希望使用密码对密钥进行加密,则只需使用以下命令重命名临时密钥,而不要执行上述步骤:

      mv tempkey.pem server_key.pem
      

      切记:如果您使用用密码加密的服务器密钥,则每次启动使用加密密钥的服务器应用程序时都必须输入密码。这意味着,除非有人或密钥输入密钥,否则服务器应用程序将无法启动。

    • 现在,您需要使用以下命令使用证书颁发机构(CA)密钥对服务器证书进行签名:

      export OPENSSL_CONF=~/myCA/caconfig.cnf
      

      先前的命令修改了环境变量OPENSSL_CONF,该变量强制openssl工具在备用位置中查找配置文件(在这种情况下,~/myCA/caconfig.cnf切换回CA配置)。

    • 然后,按如下所示签署证书:

      openssl ca -in tempreq.pem -out server_crt.pem
      

      系统将提示您输入从上面的证书颁发机构设置中创建的CA密钥的密码短语。在提示符下输入此密码,然后将提示您确认exampleserver.cnf中的信息,最后要求确认签名证书。输出应与此类似:

      Using configuration from /home/bshumate/myCA/caconfig.cnf
      Enter pass phrase for /home/bshumate/myCA/private/cakey.pem:
      Check that the request matches the signature
      Signature ok
      The Subject's Distinguished Name is as follows
      commonName            :PRINTABLE:'tradeshowhell.com'
      stateOrProvinceName   :PRINTABLE:'NC'
      countryName           :PRINTABLE:'US'
      emailAddress          :IA5STRING:'root@tradeshowhell.com'
      organizationName      :PRINTABLE:'Trade Show Hell'
      organizationalUnitName:PRINTABLE:'Black Ops'
      Certificate is to be certified until Jan  4 21:50:08 2011 GMT (1825 days)
      Sign the certificate? [y/n]:y
      
      
      1 out of 1 certificate requests certified, commit? [y/n]y
      Write out database with 1 new entries
      Data Base Updated
      
    • 使用以下命令删除临时证书和密钥文件:

      rm -f tempkey.pem && rm -f tempreq.pem
      

      恭喜你!您现在拥有一个自签名服务器应用程序证书和密钥对:

      server_crt.pem : 服务器应用程序证书文件
      
      server_key.pem : 服务器应用程序密钥文件
      

      使用要使用证书的服务器应用程序随附的文档,并输入用于正确使用证书的密钥。有关示例用法,请参见下面的为Apache配置SSL支持部分。

    5. 某些服务器应用程序的可选步骤

    • 某些服务器应用程序(例如,Courier IMAP邮件服务器应用程序)要求将未加密的私钥添加到服务器证书的前面。为此,只需输入以下命令:

      cat server_key.pem server_crt.pem > hold.pem
      mv      hold.pem server_crt.pem
      chmod   400      server_crt.pem
      

    6. 将X.509证书转换为客户端应用程序的PKCS#12

    • 如果希望从服务器的根CA X.509证书生成PKCS#12证书供客户端使用,则需要在特定的服务器证书上使用以下过程,并希望导出以下证书的密钥对:

      • 使用以下命令创建包含证书和密钥的单个文件:
      openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout mycert.pem -out mycert.pem
      
      • 然后,使用以下命令将此证书/密钥组合文件转换为PKCS#12证书:

        openssl pkcs12 -export -out mycert.pfx -in mycert.pem -name "Certificate for Whatever"
        

        系统将提示您输入可以使用的导出密码,或仅保留空白。

        生成的mycert.pfx文件现在可以导入到应用程序中,例如Web浏览器和电子邮件客户端。由于此证书代表服务器的根CA证书,因此由该CA证书签名的所有后续服务器级证书也将被安装该证书的PKCS#12版本的客户端应用程序自动接受。

    7. 生成由认可的CA签名的证书

    为了运行将要从事商业活动(例如“电子商务”)的生产服务器,需要生成证书,并由公认的证书颁发机构(CA)(例如VeriSign)对其进行签名。生成证书请求并获得由公认的CA签名的证书的过程可能很困难。在创建证书申请之前,您必须完成所有必要的“文书工作”,并确保所有必需的信息都是准确的。

    • 假设您不希望使用密码短语加密的密钥,请输入以下命令以生成私钥和证书请求:

      openssl req -new -newkey rsa:1024 -nodes -keyout mykey.pem -out myreq.pem
      
    • 如果您已经拥有要使用的密钥,请改用以下命令:

      openssl req -new -key mykey.pem -out myreq.pem
      
    • 您可能希望验证签名以及证书请求中包含的信息。使用以下命令验证签名:

      openssl req -in myreq.pem -noout -verify -key mykey.pem
      
    • 并使用以下命令验证信息:

      openssl req -in myreq.pem -noout -text
      

      下一步通常涉及将证书请求文件的内容粘贴到CA的注册表单中,然后等待证书。另外,您应该保护密钥文件,因为使用从CA接收到的证书将需要它。

    (二)在客户端应用程序中使用PKCS#12证书

    该指南的这一部分从客户端角度说明了如何使用PKCS#12证书进行SSL连接,并演示了将证书导入Firefox Web浏览器应用程序以及两个较流行的E-Mail客户端的过程。

    将根证书导入此类应用程序后,就可以从该证书到来的服务器之间建立受信任的SSL加密连接,而不会困扰有关该证书自签名的消息,依此类推。

    1. 将证书导入Mozilla Firefox

    • 将PKCS#12证书导入Mozilla Firefox Web浏览器应用程序非常简单:

      1.在Firefox中,点击编辑 > 首选项
      
      2.单击高级图标
      
      3.点击查看证书按钮
      
      4.点击导入按钮
      
      5.浏览到证书文件的位置,该文件通常是.pfx文件类型
      
      6.突出显示证书文件,然后单击“ 打开”按钮
      
      7.此时可能会提示您输入Firefox的主密码,或设置初始主密码。输入当前密码或所需的网络密码,进行确认,然后单击“ 确定”。
      
      8.然后将提示您输入证书的“ 导出密码”。如果证书中没有附加这样的密码,只需单击“ 确定”,否则输入密码,然后单击“ 确定”。
      
      9.将会出现一条消息,提示Firefox已“成功还原了您的安全证书和私钥”
      
      10.点击确定
      
      11.您已成功将服务器的客户端PKCS#12证书导入Firefox
      

    2. 将证书导入Evolution

    • 将PKCS#12证书导入Evolution电子邮件客户端再简单不过了:

      1.在Evolution中,单击编辑 > 首选项
      
      2.单击证书图标
      
      3.点击导入按钮
      
      4.浏览到证书文件的位置,该文件通常是.pfx文件类型
      
      5.突出显示证书文件,然后单击“打开”按钮
      
      6.此时可能会提示您输入Evolution的证书数据库密码,或设置初始证书数据库密码。根据需要输入当前密码或新密码,进行确认,然后单击“ 确定”。
      
      7.然后将提示您输入PKCS12文件密码。如果证书中没有附加这样的密码,只需单击“ 确定”,否则输入密码,然后单击“ 确定”。
      
      8.您应该看到该证书,并且其详细信息显示在“ Evolution设置”窗口的“ 您的证书”部分中
      
      9.点击关闭按钮
      
      10.您已成功将服务器的客户端PKCS#12证书导入到Evolution中。
      

    3. 将证书导入Mozilla Thunderbird

    • 将PKCS#12证书导入Mozilla Thunderbird电子邮件客户端应用程序非常简单:

      1.Thunderbird中,单击编辑 > 首选项
      
      2.单击高级图标
      
      3.单击右侧窗格中的“ 证书”条目
      
      4.单击管理证书按钮
      
      5.点击导入按钮
      
      6.浏览到证书文件的位置,该文件通常是.pfx文件类型
      
      7.突出显示证书文件,然后单击“打开”按钮
      
      8.此时可能会提示您输入Thunderbird的主密码,或设置初始主密码。根据需要输入当前密码或新密码,进行确认,然后单击“ 确定”。
      
      9.然后将提示您输入证书的“导出密码”。如果证书中没有附加这样的密码,只需单击“确定”,否则输入密码,然后单击“ 确定”。
      
      10.将显示一条消息,提示Thunderbird已“成功还原了您的安全证书和私钥”
      
      11.点击确定
      
      12.您已成功将服务器的客户端PKCS#12证书导入到Thunderbird中
      

    4. 将证书导入系统范围的证书颁发机构数据库

    您可以将CA证书导入到受信任证书颁发机构的系统范围的数据库中。使用该数据库的应用程序将自动信任此处存储的所有证书。

    • 将您的证书复制到系统证书目录。在终端提示下,键入:

      $ sudo cp mycert.pem /usr/share/ca-certificates/mycert.crt
      
    • 编辑ca-certificates配置文件/etc/ca-certificates.conf。将复制到/ usr / share / ca-certificates的文件的名称添加到列表的顶部,紧跟在最后的“#”之后。例如:

      # This file lists certificates that you wish to use or to ignore to be
      # installed in /etc/ssl/certs.
      # update-ca-certificates(8) will update /etc/ssl/certs by reading this file.
      #
      # This is autogenerated by dpkg-reconfigure ca-certificates.
      # certificates shoule be installed under /usr/share/ca-certificates
      # and files with extension '.crt' is recognized as available certs.
      #
      # line begins with # is comment.
      # line begins with ! is certificate filename to be deselected.
      #
      mycert.crt
      brasil.gov.br/brasil.gov.br.crt
      cacert.org/cacert.org.crt
      mozilla/ABAecom_=sub.__Am._Bankers_Assn.=_Root_CA.crt
      [... many additional certificates omitted ...]
      

      无需手动编辑此文件,您可以运行:

      sudo dpkg-reconfigure ca-certificates
      
    • 通过键入以下内容来更新CA证书数据库:

      $ sudo update-ca-certificates
      
    • 您已成功将证书导入到系统CA证书数据库中。

    三、配置Apache以支持SSL

    要为HTTPS配置Apache2并生成证书,请遵循《服务器指南-HTTPD》和《服务器指南-证书》 中的说明。

    四、资源

    与OpenSSL和安全套接字层有关的其他资源如下所示。

    本地系统资源

    命令 功能
    man config OpenSSL库配置文件的系统手册页
    man gendsa gendsa DSA私钥生成器的系统手册页
    man genrsa genrsa RSA私钥生成器的系统手册页
    man openssl openssl 命令行工具的系统手册页
    man rand rand伪随机字节生成器实用程序的系统手册页
    man x509 x509证书显示和签名实用程序的系统手册页

    万维网资源

    CACert, a FREE X.509 Certificate Authority

    OpenSSL Website

    Public Key Infrastructure (X.509) (pkix)

  • 相关阅读:
    LeetCode 81 Search in Rotated Sorted Array II(循环有序数组中的查找问题)
    LeetCode 80 Remove Duplicates from Sorted Array II(移除数组中出现两次以上的元素)
    LeetCode 79 Word Search(单词查找)
    LeetCode 78 Subsets (所有子集)
    LeetCode 77 Combinations(排列组合)
    LeetCode 50 Pow(x, n) (实现幂运算)
    LeetCode 49 Group Anagrams(字符串分组)
    LeetCode 48 Rotate Image(2D图像旋转问题)
    LeetCode 47 Permutations II(全排列)
    LeetCode 46 Permutations(全排列问题)
  • 原文地址:https://www.cnblogs.com/Yogile/p/12483021.html
Copyright © 2011-2022 走看看