在互联网数据传输过程中,数据的安全私密性是及其重要的,所以就有数据的加密和解密过程;

加密方式

一、对称加密:

特性:

1、加密方/解密方使用同一个口令

2、将原文分割成固定大小的数据块,对这些块进行加密,数据块前后会有关联关系


缺陷:

1、密钥无法交换

2、无法进行身份验证

3、无法保证数据完整性


加密算法:

DES(56bits):数据加密标准
AES(128):高级加密标准

3DES:相当于对每个数据块应用三次DES加密算法

工具:gpg,openssl enc


二、非对称加密(公钥加密)

特性:

1、密钥交换(需要在互联网传输密钥)

2、用户身份认证(对方的私钥加密的只有对方的公钥能解密)


缺陷:

数据加密过程很慢


加密算法:RSA,EIGamal,DSA


密钥交换(IKE: Internet Key Exchange)DH算法:

A,B双方使用一个较大的质数(p)和一个生成器(g),在各自选择一个数字A(x),B(y)

A=g^x%p    B=g^y%p;二者交换结果后再对各自选定的数字进行次方取值

(g^y%p)^x = (g^x%p)^y;至此完成了密钥交换,并且没有直接传输密钥。


工具:gpg,openssl rsautl


三、单向加密

特性:抽取数据特征码

1、One-Way

2、Collision-free


缺陷:

无法保证数据私密性


加密算法:

MD5,SHA1,SHA512,CRC-32(无法保证数据完整性)


工具:sha1sum, md5sum, chsum, openssl dgst


CA和PKI以及证书申请验证

CA(Certificate Authority):是负责发放和管理数字证书的权威机构,并作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。

PKI(Public Key Infrastructure):又称公开密钥基础设施,PKI体系结构采用证书管理公钥,通过第三方的可信机构CA,把用户的公钥和用户的其他标识信息捆绑在一起,在Internet网上验证用户的身份,PKI体系结构把公钥密码和对称密码结合起来,在Internet网上实现密钥的自动管理,保证网上数据的机密性、完整性。

java 实现 openssl 加密 openssl des加密_shell

上述图片大致描述了证书申请与验证的过程;其中申请证书方申请证书时,需要按规定填写申请表以及生成密钥提交申请,CA签署后发回给申请者;CA的证书是属于自签证书。

在互相得到了证书后,到CA获取公钥进行解密,解密成功可证实对方身份,之前还需要进行核实证书的有效期限和是否被吊销等信息。


OpenSSL实现私有CA

OpenSSL是一款功能强大的加密工具包。为网络通信提供安全及数据完整性的一种安全协议,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。

openssl主要包括:

libcrypto:通用功能的加密库
libssl:用于实现TLS/SSL的功能
openssl:多功能命令工具(生成密钥、创建数字证书、手动加密解密数据...)

openssl具体的命令:

[X.X.X.          73          ]          #openssl -h         
          openssl:Error:           '-h'           is           an invalid command.         
          Standard commands         
          asn1parse         ca                ciphers           cms                 
          crl               crl2pkcs7         dgst              dh                  
          dhparam           dsa               dsaparam          ec                  
          ecparam           enc               engine            errstr              
          gendh             gendsa            genpkey           genrsa              
          nseq              ocsp              passwd            pkcs12              
          pkcs7             pkcs8             pkey              pkeyparam           
          pkeyutl           prime             rand              req                 
          rsa               rsautl            s_client          s_server            
          s_time            sess_id           smime             speed               
          spkac             ts                verify            version             
          x509                
          Message Digest commands (see the `dgst' command           for           more details)         
          md2               md4               md5               rmd160              
          sha               sha1                
          Cipher commands (see the `enc' command           for           more details)         
          aes          -          128          -          cbc       aes          -          128          -          ecb       aes          -          192          -          cbc       aes          -          192          -          ecb         
          aes          -          256          -          cbc       aes          -          256          -          ecb       base64            bf                  
          bf          -          cbc            bf          -          cfb            bf          -          ecb            bf          -          ofb              
          camellia          -          128          -          cbc  camellia          -          128          -          ecb  camellia          -          192          -          cbc  camellia          -          192          -          ecb         
          camellia          -          256          -          cbc  camellia          -          256          -          ecb  cast              cast          -          cbc            
          cast5          -          cbc         cast5          -          cfb         cast5          -          ecb         cast5          -          ofb           
          des               des          -          cbc           des          -          cfb           des          -          ecb             
          des          -          ede           des          -          ede          -          cbc       des          -          ede          -          cfb       des          -          ede          -          ofb         
          des          -          ede3          des          -          ede3          -          cbc      des          -          ede3          -          cfb      des          -          ede3          -          ofb         
          des          -          ofb           des3              desx              idea                
          idea          -          cbc          idea          -          cfb          idea          -          ecb          idea          -          ofb            
          rc2               rc2          -          40          -          cbc        rc2          -          64          -          cbc        rc2          -          cbc             
          rc2          -          cfb           rc2          -          ecb           rc2          -          ofb           rc4                 
          rc4          -          40                      seed              seed          -          cbc          seed          -          cfb            
          seed          -          ecb          seed          -          ofb          zlib                
          #给了一个错误参数,能显示出具体命令



用openssl实现私有CA

先查看下openssl的配置文件:

[X.X.X.          15          ]          #vi /etc/pki/tls/openssl.cnf         
          [ CA_default ]         
          dir                       =           /          etc          /          pki          /          CA                     # 工作目录         
          certs                     =           $          dir          /          certs                      # 签署文件证书目录         
          crl_dir                   =           $          dir          /          crl                        # 吊销列表         
          database                  =           $          dir          /          index.txt                  # 数据库索引文件         
          #unique_subject = no                    #         
                    #         
          new_certs_dir             =           $          dir          /          newcerts                   # 当前签署的证书目录         
          certificate               =           $          dir          /          cacert.pem                 # CA自身的证书         
          serial                    =           $          dir          /          serial                     # 当前签署的证书编号         
          crlnumber                 =           $          dir          /          crlnumber                  # 吊销列表编号         
                    #         
          crl                       =           $          dir          /          crl.pem                    # 当前使用的crl         
          private_key               =           $          dir          /          private          /          cakey.pem          # CA的私有KEY         
          RANDFILE                  =           $          dir          /          private          /          .rand              # private random number file         
          x509_extensions           =           usr_cert                        # The extentions to add to the cert



配置文件中可以看到定义了CA默认的属性;了解到上述属性后就可以手动配置CA了:

1、切换到CA的目录下,生成密钥对


[X.X.X.          15          ]          #(umask 077;openssl genrsa -out private/cakey.pem 2048)         
          Generating RSA private key,           2048           bit           long           modulus         
          ................................................          +          +          +         
          ............................................................................          +          +          +         
          e           is           65537           (          0x10001          )         
          [X.X.X.          15          ]          #ll -l private/cakey.pem         
          -          rw          -          -          -          -          -          -          -           1           root root           1679           Mar            9           14          :          48           private          /          cakey.pem         
          [X.X.X.          15          ]          #         
          #括号是在子SHELL中执行命令,变量不会影响到父进程,由于是私有key,所以权限很重要,故;在括号内设置了umask值         
          #密钥生成的只有私钥,公钥是通过特定格式从私钥中提取的



2、生成自签证书


[X.X.X.          15          ]          #openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 365         
          You are about to be asked to enter information that will be incorporated         
          into your certificate request.         
          What you are about to enter           is           what           is           called a Distinguished Name           or           a DN.         
          There are quite a few fields but you can leave some blank         
          For some fields there will be a default value,         
          If you enter           '.'          , the field will be left blank.         
          -          -          -          -          -         
          Country Name (          2           letter code) [XX]:CN         
          State           or           Province Name (full name) []:HN         
          Locality Name (eg, city) [Default City]:ZZ         
          Organization Name (eg, company) [Default Company Ltd]:Linux         
          Organizational Unit Name (eg, section) []:Centos         
          Common Name (eg, your name           or           your server's hostname) []:ca.mage.com                #这项很重要;一般是主机名         
          Email Address []:caadmin@linux.com         
          [X.X.X.          15          ]          #ls         
          cacert.pem  certs  crl  newcerts  private



3、在CA下创建index.txt等文件

[X.X.X.15]          #touch index.txt serial crlnumber         
          [X.X.X.15]          #ls         
          cacert.pem  certs  crl  crlnumber  index.txt  newcerts  private  serial         
          [X.X.X.15]          #echo 00 > serial #给一个初始号码;否则签署证书时会报错         
          [X.X.X.15]          #         
          #这几个文件默认是没有的,需要手动创建,否则签署证书时会报错




用openssl实现证书申请

1、在主机上生成密钥,保存至应用此证书的服务的配置文件目录下

下面以httpd作为实例实验

#在httpd目录新建一个专门存储的目录ssl         
          [X.X.X.          73          ]          #pwd         
          /          etc          /          httpd          /          ssl         
          [X.X.X.          73          ]          #(umask 077;openssl genrsa -out httpd.key 1024)         
          Generating RSA private key,           1024           bit           long           modulus         
          ..................          +          +          +          +          +          +         
          ........          +          +          +          +          +          +         
          e           is           65537           (          0x10001          )         
          [X.X.X.          73          ]          #ll         
          total           4         
          -          rw          -          -          -          -          -          -          -           1           root root           887           Mar            9           11          :          32           httpd.key



2、生成证书签署请求文件

[X.X.X.          73          ]          #openssl req -new -key httpd.key -out httpd.csr         
          You are about to be asked to enter information that will be incorporated         
          into your certificate request.         
          What you are about to enter           is           what           is           called a Distinguished Name           or           a DN.         
          There are quite a few fields but you can leave some blank         
          For some fields there will be a default value,         
          If you enter           '.'          , the field will be left blank.         
          -          -          -          -          -         
          Country Name (          2           letter code) [XX]:CN         
          State           or           Province Name (full name) []:HN         
          Locality Name (eg, city) [Default City]:ZZ         
          Organization Name (eg, company) [Default Company Ltd]:Linux         
          Organizational Unit Name (eg, section) []:Linux         
          Common Name (eg, your name           or           your server's hostname) []:          73.soul          .com         
          Email Address []:          73          @soul.com         
          Please enter the following           'extra'           attributes         
          to be sent with your certificate request         
          A challenge password []:         
          An optional company name []:         
          [X.X.X.          73          ]          #ls         
          httpd.csr  httpd.key         
          [X.X.X.          73          ]          #         
          #与CA上证书生成是差不多的,区别在于主机名和多了个密码,密码这里留空         
          #由于是内部使用,前面的信息填写必须一致



3、请求文件发送给CA

#在CA的主机/etc/pki下新建一个文件专门存储审核文件         
          [X.X.X.          15          ]          #pwd         
          /          etc          /          pki          /          sign         
          #         
          #         
          [X.X.X.          73          ]          #scp httpd.csr X.X.X.15:/etc/pki/sign         
          root@X.X.X.          15          's password:         
          httpd.csr                                                            100          %            676               0.7KB          /          s             00          :          00         
          [X.X.X.          73          ]          #


CA签署证书

[X.X.X.          15          ]          #openssl ca -in httpd.csr -out httpd.crt -days 3655         
          Using configuration           from           /          etc          /          pki          /          tls          /          openssl.cnf         
          Check that the request matches the signature         
          Signature ok         
          Certificate Details:         
                    Serial Number:           0           (          0x0          )         
                    Validity         
                    Not Before: Mar            9           07          :          19          :          50           2014           GMT         
                    Not After : Mar           11           07          :          19          :          50           2024           GMT         
                    Subject:         
                    countryName                         =           CN         
                    stateOrProvinceName                 =           HN         
                    organizationName                    =           Linux         
                    organizationalUnitName              =           Linux         
                    commonName                          =           73.soul          .com         
                    emailAddress                        =           73          @soul.com         
                    X509v3 extensions:         
                    X509v3 Basic Constraints:         
                    CA:FALSE         
                    Netscape Comment:         
                    OpenSSL Generated Certificate         
                    X509v3 Subject Key Identifier:         
                    B1:          4A          :          39          :          93          :C1:          9A          :          10          :C7:          81          :          67          :          74          :E2:          4D          :          97          :C3:A1:          0A          :AD:          1F          :          62         
                    X509v3 Authority Key Identifier:         
                    keyid:B5:          12          :          83          :          5A          :          54          :B0:          1B          :          98          :          34          :          4E          :D9:A6:          31          :          95          :          5F          :          14          :BB:          61          :D9:EF         
          Certificate           is           to be certified until Mar           11           07          :          19          :          50           2024           GMT (          3655           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         
          #         
          #         
          [X.X.X.          15          ]          #scp httpd.crt X.X.X.73:/etc/httpd/ssl         
          root@X.X.X.          73          's password:         
          httpd.crt                                                            100          %           3803               3.7KB          /          s             00          :          00         
          [X.X.X.          15          ]          #         
          #         
          [X.X.X.          73          ]          #ls         
          httpd.crt  httpd.csr  httpd.key            #对方主机以收到



至此一个简单的CA以及申请和签署步骤已完成。

还有一个可以吊销证书的命令:

openssl ca           -          revoke           /          path          /          to          /          somefile.crt



这里就不在测试。证书吊销需要在用户申请或者用户未付款的情况下。

正常状态下是不能操作的。

这种CA一般应用于内部局域网,如大范围使用或专业使用,建议使用OpenCA或者购买专业公司提供的。



本文转自Mr_陈 51CTO博客,原文链接:http://blog.51cto.com/chenpipi/1371371,如需转载请自行联系原作者