长期支持版本

    社区创新版本

      TLCP协议栈

      概述

      TLCP是指符合《GB/T38636 2020信息安全技术 传输层密码协议(TLCP)》的安全通信协议,其特点是采用加密证书/私钥和签名证书/私钥相分离的方式。openEuler 22.09版本之后发布的openSSL 1.1.1 软件在开源版本的基础上增加了对商密TLCP协议的支持,提供了如下主要的功能:

      • 新增对TLCP商密双证书加载的支持;
      • 新增对ECC_SM4_CBC_SM3和ECDHE_SM4_CBC_SM3算法套件的支持;
      • 新增对SM2证书的支持。

      前置条件

      openEuler操作系统安装的openSSL软件版本号大于1.1.1m-6(openSSL 3.0.x暂不支持):

      $ rpm -qa openssl
      openssl-1.1.1m-6.oe2209.x86_64
      

      如何使用

      场景1:生成SM2双证书

      根据TLCP协议标准,通信过程需要两本证书:签名证书和加密证书。签名证书在认证过程使用,作用是验证身份;加密证书在密钥协商时使用,作用是数据加密。CA是证书认证机构(Certificate Authority)的缩写。CSR证书请求文件得到CA的签发后才可形成证书。下面是一个参考案例,介绍使用自签名的CA证书来签发实体证书:

      1. 准备生成证书所需要使用的配置文件openssl.cnf,参考的内容如下(基于openssl源码apps/openssl.cnf修改):

        # This definition stops the following lines choking if HOME isn't
        # defined.
        HOME   = .
        
        # Extra OBJECT IDENTIFIER info:
        #oid_file  = $ENV::HOME/.oid
        oid_section  = new_oids
        
        # To use this configuration file with the "-extfile" option of the
        # "openssl x509" utility, name here the section containing the
        # X.509v3 extensions to use:
        # extensions  =
        # (Alternatively, use a configuration file that has only
        # X.509v3 extensions in its main [= default] section.)
        
        [ new_oids ]
        
        # We can add new OIDs in here for use by 'ca', 'req' and 'ts'.
        # Add a simple OID like this:
        # testoid1=1.2.3.4
        # Or use config file substitution like this:
        # testoid2=${testoid1}.5.6
        
        # Policies used by the TSA examples.
        tsa_policy1 = 1.2.3.4.1
        tsa_policy2 = 1.2.3.4.5.6
        tsa_policy3 = 1.2.3.4.5.7
        
        ####################################################################
        [ ca ]
        default_ca = CA_default  # The default ca section
        
        ####################################################################
        [ CA_default ]
        
        dir  = ./demoCA  # Where everything is kept
        certs  = $dir/certs  # Where the issued certs are kept
        crl_dir  = $dir/crl  # Where the issued crl are kept
        database = $dir/index.txt # database index file.
        #unique_subject = no   # Set to 'no' to allow creation of
            # several certs with same subject.
        new_certs_dir = $dir/newcerts  # default place for new certs.
        
        certificate = $dir/cacert.pem  # The CA certificate
        serial  = $dir/serial   # The current serial number
        crlnumber = $dir/crlnumber # the current crl number
            # must be commented out to leave a V1 CRL
        crl  = $dir/crl.pem   # The current CRL
        private_key = $dir/private/cakey.pem# The private key
        
        x509_extensions = usr_cert  # The extensions to add to the cert
        
        # Comment out the following two lines for the "traditional"
        # (and highly broken) format.
        name_opt  = ca_default  # Subject Name options
        cert_opt  = ca_default  # Certificate field options
        
        # Extension copying option: use with caution.
        # copy_extensions = copy
        
        # Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs
        # so this is commented out by default to leave a V1 CRL.
        # crlnumber must also be commented out to leave a V1 CRL.
        # crl_extensions = crl_ext
        
        default_days = 365   # how long to certify for
        default_crl_days= 30   # how long before next CRL
        default_md = default  # use public key default MD
        preserve = no   # keep passed DN ordering
        
        # A few difference way of specifying how similar the request should look
        # For type CA, the listed attributes must be the same, and the optional
        # and supplied fields are just that :-)
        policy  = policy_match
        
        # For the CA policy
        [ policy_match ]
        countryName  = match
        stateOrProvinceName = match
        organizationName = match
        organizationalUnitName = optional
        commonName  = supplied
        emailAddress  = optional
        
        # For the 'anything' policy
        # At this point in time, you must list all acceptable 'object'
        # types.
        [ policy_anything ]
        countryName  = optional
        stateOrProvinceName = optional
        localityName  = optional
        organizationName = optional
        organizationalUnitName = optional
        commonName  = supplied
        emailAddress  = optional
        
        ####################################################################
        [ req ]
        default_bits  = 2048
        default_keyfile  = privkey.pem
        distinguished_name = req_distinguished_name
        attributes  = req_attributes
        x509_extensions = v3_ca # The extensions to add to the self signed cert
        
        # Passwords for private keys if not present they will be prompted for
        # input_password = secret
        # output_password = secret
        
        # This sets a mask for permitted string types. There are several options.
        # default: PrintableString, T61String, BMPString.
        # pkix  : PrintableString, BMPString (PKIX recommendation before 2004)
        # utf8only: only UTF8Strings (PKIX recommendation after 2004).
        # nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings).
        # MASK:XXXX a literal mask value.
        # WARNING: ancient versions of Netscape crash on BMPStrings or UTF8Strings.
        string_mask = utf8only
        
        # req_extensions = v3_req # The extensions to add to a certificate request
        
        [ req_distinguished_name ]
        countryName   = Country Name (2 letter code)
        countryName_default  = AU
        countryName_min   = 2
        countryName_max   = 2
        
        stateOrProvinceName  = State or Province Name (full name)
        stateOrProvinceName_default = Some-State
        
        localityName   = Locality Name (eg, city)
        
        0.organizationName  = Organization Name (eg, company)
        0.organizationName_default = Internet Widgits Pty Ltd
        
        # we can do this but it is not needed normally :-)
        #1.organizationName  = Second Organization Name (eg, company)
        #1.organizationName_default = World Wide Web Pty Ltd
        
        organizationalUnitName  = Organizational Unit Name (eg, section)
        #organizationalUnitName_default =
        
        commonName   = Common Name (e.g. server FQDN or YOUR name)
        commonName_max   = 64
        
        emailAddress   = Email Address
        emailAddress_max  = 64
        
        # SET-ex3   = SET extension number 3
        
        [ req_attributes ]
        challengePassword  = A challenge password
        challengePassword_min  = 4
        challengePassword_max  = 20
        
        unstructuredName  = An optional company name
        
        [ usr_cert ]
        
        # These extensions are added when 'ca' signs a request.
        
        # This goes against PKIX guidelines but some CAs do it and some software
        # requires this to avoid interpreting an end user certificate as a CA.
        
        basicConstraints=CA:FALSE
        
        # Here are some examples of the usage of nsCertType. If it is omitted
        # the certificate can be used for anything *except* object signing.
        
        # This is OK for an SSL server.
        # nsCertType   = server
        
        # For an object signing certificate this would be used.
        # nsCertType = objsign
        
        # For normal client use this is typical
        # nsCertType = client, email
        
        # and for everything including object signing:
        # nsCertType = client, email, objsign
        
        # This is typical in keyUsage for a client certificate.
        # keyUsage = nonRepudiation, digitalSignature, keyEncipherment
        
        # This will be displayed in Netscape's comment listbox.
        nsComment   = "OpenSSL Generated Certificate"
        
        # PKIX recommendations harmless if included in all certificates.
        subjectKeyIdentifier=hash
        authorityKeyIdentifier=keyid,issuer
        
        # This stuff is for subjectAltName and issuerAltname.
        # Import the email address.
        # subjectAltName=email:copy
        # An alternative to produce certificates that aren't
        # deprecated according to PKIX.
        # subjectAltName=email:move
        
        # Copy subject details
        # issuerAltName=issuer:copy
        
        #nsCaRevocationUrl  = http://www.domain.dom/ca-crl.pem
        #nsBaseUrl
        #nsRevocationUrl
        #nsRenewalUrl
        #nsCaPolicyUrl
        #nsSslServerName
        
        # This is required for TSA certificates.
        # extendedKeyUsage = critical,timeStamping
        
        [ v3_req ]
        
        # Extensions to add to a certificate request
        
        basicConstraints = CA:FALSE
        keyUsage = nonRepudiation, digitalSignature
        
        [ v3enc_req ]
        
        # Extensions to add to a certificate request
        
        basicConstraints = CA:FALSE
        keyUsage = keyAgreement, keyEncipherment, dataEncipherment
        
        [ v3_ca ]
        
        # Extensions for a typical CA
        
        
        # PKIX recommendation.
        
        subjectKeyIdentifier=hash
        
        authorityKeyIdentifier=keyid:always,issuer
        
        basicConstraints = critical,CA:true
        
        # Key usage: this is typical for a CA certificate. However since it will
        # prevent it being used as an test self-signed certificate it is best
        # left out by default.
        keyUsage = cRLSign, keyCertSign
        
        # Some might want this also
        # nsCertType = sslCA, emailCA
        
        # Include email address in subject alt name: another PKIX recommendation
        # subjectAltName=email:copy
        # Copy issuer details
        # issuerAltName=issuer:copy
        
        # DER hex encoding of an extension: beware experts only!
        # obj=DER:02:03
        # Where 'obj' is a standard or added object
        # You can even override a supported extension:
        # basicConstraints= critical, DER:30:03:01:01:FF
        
        [ crl_ext ]
        
        # CRL extensions.
        # Only issuerAltName and authorityKeyIdentifier make any sense in a CRL.
        
        # issuerAltName=issuer:copy
        authorityKeyIdentifier=keyid:always
        
        [ proxy_cert_ext ]
        # These extensions should be added when creating a proxy certificate
        
        # This goes against PKIX guidelines but some CAs do it and some software
        # requires this to avoid interpreting an end user certificate as a CA.
        
        basicConstraints=CA:FALSE
        
        # Here are some examples of the usage of nsCertType. If it is omitted
        # the certificate can be used for anything *except* object signing.
        
        # This is OK for an SSL server.
        # nsCertType   = server
        
        # For an object signing certificate this would be used.
        # nsCertType = objsign
        
        # For normal client use this is typical
        # nsCertType = client, email
        
        # and for everything including object signing:
        # nsCertType = client, email, objsign
        
        # This is typical in keyUsage for a client certificate.
        # keyUsage = nonRepudiation, digitalSignature, keyEncipherment
        
        # This will be displayed in Netscape's comment listbox.
        nsComment   = "OpenSSL Generated Certificate"
        
        # PKIX recommendations harmless if included in all certificates.
        subjectKeyIdentifier=hash
        authorityKeyIdentifier=keyid,issuer
        
        # This stuff is for subjectAltName and issuerAltname.
        # Import the email address.
        # subjectAltName=email:copy
        # An alternative to produce certificates that aren't
        # deprecated according to PKIX.
        # subjectAltName=email:move
        
        # Copy subject details
        # issuerAltName=issuer:copy
        
        #nsCaRevocationUrl  = http://www.domain.dom/ca-crl.pem
        #nsBaseUrl
        #nsRevocationUrl
        #nsRenewalUrl
        #nsCaPolicyUrl
        #nsSslServerName
        
        # This really needs to be in place for it to be a proxy certificate.
        proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo
        
        ####################################################################
        [ tsa ]
        
        default_tsa = tsa_config1 # the default TSA section
        
        [ tsa_config1 ]
        
        # These are used by the TSA reply generation only.
        dir  = ./demoCA  # TSA root directory
        serial  = $dir/tsaserial # The current serial number (mandatory)
        crypto_device = builtin  # OpenSSL engine to use for signing
        signer_cert = $dir/tsacert.pem  # The TSA signing certificate
            # (optional)
        certs  = $dir/cacert.pem # Certificate chain to include in reply
            # (optional)
        signer_key = $dir/private/tsakey.pem # The TSA private key (optional)
        signer_digest  = sha256   # Signing digest to use. (Optional)
        default_policy = tsa_policy1  # Policy if request did not specify it
            # (optional)
        other_policies = tsa_policy2, tsa_policy3 # acceptable policies (optional)
        digests     = sha1, sha256, sha384, sha512  # Acceptable message digests (mandatory)
        accuracy = secs:1, millisecs:500, microsecs:100 # (optional)
        clock_precision_digits  = 0 # number of digits after dot. (optional)
        ordering  = yes # Is ordering defined for timestamps?
            # (optional, default: no)
        tsa_name  = yes # Must the TSA name be included in the reply?
            # (optional, default: no)
        ess_cert_id_chain = no # Must the ESS cert id chain be included?
            # (optional, default: no)
        ess_cert_id_alg  = sha1 # algorithm to compute certificate
            # identifier (optional, default: sha1)
        
      2. 生成自签名CA证书(下列命令为使用openSSL 1.1.1版本的场景,如使用openSSL 3.0.9及以上的版本,openssl req命令中的*-newkey参数需要替换为sm2:SM2.pem*):

        openssl ecparam -name SM2 -out SM2.pem
        openssl req -config ./openssl.cnf -nodes -subj '/C=AA/ST=BB/O=CC/OU=DD/CN=root ca' -keyout CA.key -newkey ec:SM2.pem -new -out CA.csr
        openssl x509 -sm3 -req -days 30 -in CA.csr -extfile ./openssl.cnf -extensions v3_ca -signkey CA.key -out CA.crt
        
      3. 生成服务端签名证书和加密证书(下列命令为使用openSSL 1.1.1版本的场景,如使用openSSL 3.0.9及以上的版本,openssl req命令中的*-newkey参数需要替换为sm2:SM2.pem*):

        openssl req -config ./openssl.cnf -nodes -subj '/C=AA/ST=BB/O=CC/OU=DD/CN=server sign' -keyout SS.key -newkey ec:SM2.pem -new -out SS.csr
        openssl x509 -sm3 -req -days 30 -in SS.csr -CA CA.crt -CAkey CA.key -extfile ./openssl.cnf -extensions v3_req -out SS.crt -CAcreateserial
        openssl req -config ./openssl.cnf -nodes -subj '/C=AA/ST=BB/O=CC/OU=DD/CN=server enc' -keyout SE.key -newkey ec:SM2.pem -new -out SE.csr
        openssl x509 -sm3 -req -days 30 -in SE.csr -CA CA.crt -CAkey CA.key -extfile ./openssl.cnf -extensions v3enc_req -out SE.crt -CAcreateserial
        
      4. 生成客户端签名证书和加密证书:

        openssl req -config ./openssl.cnf -nodes -subj '/C=AA/ST=BB/O=CC/OU=DD/CN=client sign' -keyout CS.key -newkey ec:SM2.pem -new -out CS.csr
        openssl x509 -sm3 -req -days 30 -in CS.csr -CA CA.crt -CAkey CA.key -extfile ./openssl.cnf -extensions v3_req -out CS.crt -CAcreateserial
        openssl req -config ./openssl.cnf -nodes -subj '/C=AA/ST=BB/O=CC/OU=DD/CN=client enc' -keyout CE.key -newkey ec:SM2.pem -new -out CE.csr
        openssl x509 -sm3 -req -days 30 -in CE.csr -CA CA.crt -CAkey CA.key -extfile ./openssl.cnf -extensions v3enc_req -out CE.crt -CAcreateserial
        

      场景2:使用openSSL命令行验证TLCP协议栈

      openSSL中提供的s_server/s_client工具可以用来测试TLCP协议:

      # 开启服务端
      openssl s_server  -verify 5 -accept 4433 \
          -cert SS.crt \
          -key SS.key \
          -dcert SE.crt \
          -dkey SE.key \
          -CAfile CA.crt
      
      # 开启客户端
      openssl s_client -verify 5 -connect 127.0.0.1:4433 \
          -cert CS.crt \
          -key CS.key \
          -dcert CE.crt \
          -dkey CE.key \
          -CAfile CA.crt -tlcp
      

      场景3:openSSL API使用

      服务端参考代码:

      int main() {
          // 变量定义
          SSL_CTX *ctx = NULL;
          const char *sign_cert_file = "SS.crt";
          const char *sign_key_file = "SS.key";
          const char *enc_cert_file = "SE.crt";
          const char *enc_key_file = "SE.key";
      
          // 生成上下文
          ctx = SSL_CTX_new(TLS_server_method());
      
          // 加载签名证书,加密证书及其私钥
          if (!SSL_CTX_use_gm_certificate_file(ctx, sign_cert_file, SSL_FILETYPE_PEM, SSL_USAGE_SIG))
              goto err;
      
          if (!SSL_CTX_use_gm_PrivateKey_file(ctx, sign_key_file, SSL_FILETYPE_PEM, SSL_USAGE_SIG))
              goto err;
      
          if (!SSL_CTX_use_gm_certificate_file(ctx, enc_cert_file, SSL_FILETYPE_PEM, SSL_USAGE_ENC))
              goto err;
      
          if (!SSL_CTX_use_gm_PrivateKey_file(ctx, enc_key_file, SSL_FILETYPE_PEM, SSL_USAGE_ENC))
              goto err;
      
          SSL_CTX_set_options(ctx, SSL_OP_ENCCERT_SECOND_POSITION);
      
          // 后续同标准tls流程
          SSL *ssl = SSL_new(ctx);
      }
      

      客户端参考代码:

      int main() {
          // 变量定义
          SSL_CTX *ctx = NULL;
          const char *sign_cert_file = "CS.crt";
          const char *sign_key_file = "CS.key";
          const char *enc_cert_file = "CE.crt";
          const char *enc_key_file = "CE.key";
      
          // 生成上下文
          ctx = SSL_CTX_new(TLCP_client_method());
      
          // 加载签名证书,加密证书及其私钥
          if (!SSL_CTX_use_gm_certificate_file(ctx, sign_cert_file, SSL_FILETYPE_PEM, SSL_USAGE_SIG))
              goto err;
      
          if (!SSL_CTX_use_gm_PrivateKey_file(ctx, sign_key_file, SSL_FILETYPE_PEM, SSL_USAGE_SIG))
              goto err;
      
          if (!SSL_CTX_use_gm_certificate_file(ctx, enc_cert_file, SSL_FILETYPE_PEM, SSL_USAGE_ENC))
              goto err;
      
          if (!SSL_CTX_use_gm_PrivateKey_file(ctx, enc_key_file, SSL_FILETYPE_PEM, SSL_USAGE_ENC))
              goto err;
      
          // 设置算法套件为ECC-SM4-CBC-SM3或者ECDHE-SM4-CBC-SM3
          // 这一步并不强制编写,默认ECC-SM4-CBC-SM3优先
          if(SSL_CTX_set_cipher_list(ctx, "ECC-SM4-CBC-SM3") <= 0)
              goto err;
      
          // 后续同标准tls流程
          SSL *ssl = SSL_new(ctx);
      }
      

      KTLS卸载

      概述

      Linux内核协议栈仅实现了TCP/IP模型,并不支持SSL/TLS会话层协议。目前TLS加解密一般由用户态来实现。但在部分场景下,如内核sendfile发送文件,会产生多次跨态拷贝导致性能开销。因此内核实现了KTLS,即支持对socket配置加密上下文,从而将数据加密过程卸载到内核态或下层硬件实现。

      openEuler 6.4内核的KTLS特性提供了对商密算法的支持,目前支持SM4-GCM和SM4-CCM两种算法。

      前置条件

      内核大于或等于6.4.0-10版本:

      # rpm -qa kernel
      kernel-6.4.0-10.1.0.20.oe2309.x86_64
      

      如何使用

      商密算法的调用和其他相同类型的加密算法调用方法一致,可参考inux内核文档

      文档捉虫

      “有虫”文档片段

      问题描述

      提交类型 issue

      有点复杂...

      找人问问吧。

      PR

      小问题,全程线上修改...

      一键搞定!

      问题类型
      规范和低错类

      ● 错别字或拼写错误;标点符号使用错误;

      ● 链接错误、空单元格、格式错误;

      ● 英文中包含中文字符;

      ● 界面和描述不一致,但不影响操作;

      ● 表述不通顺,但不影响理解;

      ● 版本号不匹配:如软件包名称、界面版本号;

      易用性

      ● 关键步骤错误或缺失,无法指导用户完成任务;

      ● 缺少必要的前提条件、注意事项等;

      ● 图形、表格、文字等晦涩难懂;

      ● 逻辑不清晰,该分类、分项、分步骤的没有给出;

      正确性

      ● 技术原理、功能、规格等描述和软件不一致,存在错误;

      ● 原理图、架构图等存在错误;

      ● 命令、命令参数等错误;

      ● 代码片段错误;

      ● 命令无法完成对应功能;

      ● 界面错误,无法指导操作;

      风险提示

      ● 对重要数据或系统存在风险的操作,缺少安全提示;

      内容合规

      ● 违反法律法规,涉及政治、领土主权等敏感词;

      ● 内容侵权;

      您对文档的总体满意度

      非常不满意
      非常满意
      提交
      根据您的反馈,会自动生成issue模板。您只需点击按钮,创建issue即可。
      文档捉虫
      编组 3备份