背景

OMG组织对于DDS的安全机制有着对应的定义,其定义在DDS-SECURITY文档中。

这其中主要包含了对应的身份认证、访问控制、通信加密和审计相关的插件。

FastDDS安全机制1 - 安全配置-LMLPHP

资料来源:DDS-SECURITY

其实也主要保护了通信过程中的相关安全风险。

FastDDS安全机制1 - 安全配置-LMLPHP

资料来源:DDS-SECURITY

我们都知道,通信过程中,主要存在着如上图的对应安全风险,例如:未授权访问,通信信道窃听,重放攻击等等。

而这些安全问题,目前业界普遍的解法就是对应的身份认证,访问控制和通信加密机制。

因此DDS定义的这一套安全机制也是相对比较完善的。

下面主要介绍一下对应具体的机制。

身份认证

FastDDS的身份认证插件主要是利用了PKI体系。因此,对应的插件名称也叫DDS:Auth:PKI-DH.

这个插件主要是针对于DDS的DomianParticipant进行身份的标识的。

我们知道,其实身份认证主要做了两件事,一件是标识不同的身份,第二件就是保证身份是可信的。

所以FastDDS使用PKI体系,需要每一个DomianParticipant都配置自己的公私钥,并且通过CA认证来保证身份证书是可信的。

并且,基于身份认证的过程,可以去交换后续的通信加密密钥。

使用

准备

所以如果要使用FastDDS自带的身份认证插件。首先我们需要准备如下的东西:

  1. 自己生成的CA公私钥对
  2. 自己生成对应的DomainParticipant身份公私钥对
  3. 利用CA对身份证书签名,生成CA签名后的身份证书

部署

部署的话,其实就需要我们将对应生成好的身份证书部署到对应的设备上。

这里部署的话,其实需要部署如下的信息。

  1. 上面生成的CA公钥证书文件(X509)
  2. CA签过名的身份证书文件
  3. 上面生成的身份私钥文件
  4. CRL文件

实际使用

FastDDS官方文档上已经给出了对应的使用说明,目前是可以通过C++在代码中直接实现,也可以通过预置写好的XML文件。

C++的方法如下:

DomainParticipantQos pqos;

// Activate DDS:Auth:PKI-DH plugin
pqos.properties().properties().emplace_back("dds.sec.auth.plugin",
        "builtin.PKI-DH");

// Configure DDS:Auth:PKI-DH plugin
pqos.properties().properties().emplace_back(
    "dds.sec.auth.builtin.PKI-DH.identity_ca",
    "file://maincacert.pem");
pqos.properties().properties().emplace_back(
    "dds.sec.auth.builtin.PKI-DH.identity_certificate",
    "file://partcert.pem");
pqos.properties().properties().emplace_back(
    "dds.sec.auth.builtin.PKI-DH.identity_crl",
    "file://crl.pem");
pqos.properties().properties().emplace_back(
    "dds.sec.auth.builtin.PKI-DH.private_key",
    "file://partkey.pem");
pqos.properties().properties().emplace_back(
    "dds.sec.auth.builtin.PKI-DH.password",
    "domainParticipantPassword");

生成证书

根据上面需要的情况我们知道,证书相关的文件最少是需要4个文件。

  1. ca证书
  2. ca签过名的身份认证证书
  3. crl吊销列表
  4. 身份认证私钥

ca证书生成

官方给出了一个配置文件

# File: maincaconf.cnf
# OpenSSL example Certificate Authority configuration file

####################################################################
[ ca ]
default_ca = CA_default # The default ca section

####################################################################
[ CA_default ]

dir = . # 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 ctificates with same subject.
new_certs_dir = $dir

certificate = $dir/maincacert.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/maincakey.pem # The private key
RANDFILE = $dir/private/.rand # private random number file

name_opt = ca_default # Subject Name options
cert_opt = ca_default # Certificate field options

default_days= 1825 # how long to certify for
default_crl_days = 30 # how long before next CRL
default_md = sha256 # which md to use.
preserve = no # keep passed DN ordering

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 ]
prompt = no
#default_bits = 1024
#default_keyfile = privkey.pem
distinguished_name= req_distinguished_name
#attributes = req_attributes
#x509_extensions = v3_ca # The extentions to add to the self signed cert
string_mask = utf8only

[ req_distinguished_name ]
countryName = CN
stateOrProvinceName = ZJ
localityName = HZ
0.organizationName = seven
commonName = xx
emailAddress = xx@qq.com

通过配置文件,定义了证书的一些基本信息,因此通过配置文件,调用openssl生成对应的ecdsa密钥对。

注意上述的配置文件中需要手动创建对应database=$dir/index.txt。否则在对身份认证证书签名的时候就会出错。

openssl ecparam -name prime256v1 > ecdsaparam

openssl req -nodes -x509 \
  -days 3650 \
  -newkey ec:ecdsaparam \
  -keyout maincakey.pem \
  -out maincacert.pem \
  -config maincaconf.cnf

这里的ecparam参数主要是生成对应的ecdsaparam的参数,指定对应的算法名称,方便后续openssl生成密钥时自动查找算法。

生成身份认证密钥对

同样先编写配置文件。

# File: partconf.cnf

prompt = no
string_mask = utf8only
distinguished_name = req_distinguished_name

[ req_distinguished_name ]
countryName = CN
stateOrProvinceName = ZJ
localityName = HZ
organizationName = seven
emailAddress = xx@qq.com
commonName = xx

之后调用openssl生成对应的请求证书和私钥

openssl req -nodes \
  -new -newkey ec:ecdsaparam \
  -config identitycertconf.cnf \
  -keyout partkey.pem \
  -out partreq.pem

使用CA私钥对刚刚生成的证书进行签名。

openssl ca -batch -create_serial \
  -config maincaconf.cnf \
  -days 3650 \
  -in partreq.pem \
  -out partcert.pem

FastDDS安全机制1 - 安全配置-LMLPHP

05-18 04:12