gpt4 book ai didi

x509 - 如何使用基于 node-opcua 的客户端连接到需要基于证书的用户身份验证的 OPC-UA 服务器

转载 作者:行者123 更新时间:2023-12-04 14:11:05 28 4
gpt4 key购买 nike

我正在使用 node-opcua 库来构建 OPC UA 客户端。我已经使用基本示例连接到 OPC-UA 服务器(prosys OPC-UA 模拟服务器),但现在我想让我的客户端支持各种身份验证方法。
我能够使用以下代码获得基于用户名 + 密码的身份验证:

const client = OPCUAClient.create(options);
await client.connect(endpointUrl);
let userIdentity = {type: opcua.UserTokenType.UserName, userName: "bruce", password: "test" };
const session = await client.createSession(userIdentity);
在 prosys OPC-UA 模拟服务器上,我检查了“用户名 + 密码”身份验证方法并创建了匹配的用户。
但是,现在我想让基于 X.509 证书的用户身份验证正常工作。有没有人在 node-opcua 和使用 OpenSSL 生成证书的方向上有一个工作示例?

最佳答案

所以我想通了!这是其他可能想要它的人(或我 future 的自己)的答案
首先,证书似乎需要正确的用法和扩展。当我在没有这些的情况下生成证书时,它不起作用。创建一个名为 user-key.conf 的文件内容类似于:

[ req ]
default_bits = 2048
default_md = sha256
distinguished_name = subject
req_extensions = req_ext
x509_extensions = req_ext
string_mask = utf8only
prompt = no

[ req_ext ]
basicConstraints = CA:FALSE
nsCertType = client, server
keyUsage = nonRepudiation, digitalSignature, keyEncipherment, dataEncipherment, keyCertSign
extendedKeyUsage= serverAuth, clientAuth
nsComment = "Bruces User Cert"
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
subjectAltName = URI:urn:opcua:user:bruce,IP: 127.0.0.1

[ subject ]
countryName = US
stateOrProvinceName = TX
localityName = Houston
organizationName = AL
commonName = bruce
请注意,在此示例中,我生成的是自签名证书。我不是安全专家,所以我不知道所有这些声明的含义,我也没有测试过哪些是绝对必要的。我发现的一些信息似乎表明 commonName 应该对应于 OPC 服务器中的用户名,但这是我在研究中了解到的唯一细节。
接下来,使用 openssl 和这个配置文件来创建一个证书和私钥对: > openssl.exe req -x509 -days 365 -new -out bruce1.pem -keyout bruce1_key.pem -config user-key.conf出于某些(可能是一个很好的安全相关)原因,openssl 强制您指定一个密码来保护私钥。到目前为止,我还没有弄清楚如何在 node.js 中解密它,所以我发现我可以使用以下命令将其删除: > openssl.exe rsa -in bruce1_key.pem -out bruce1_key_nopass.pem然后,至少使用我正在测试的 OPC-UA 服务器(prosys OPC-UA 模拟服务器),有必要获取 .der 格式的证书: > openssl.exe x509 -inform PEM -outform DER -in bruce1.pem -out bruce1.der此 .der 文件需要加载到 OPC-UA 服务器中。对于 prosys,这是通过将其复制到 .\prosys-opc-ua-simulation-server\USERS_PKI\CA\certs 中来完成的。文件夹。
在 node.js 中,以下代码将使用生成的证书文件进行连接:
const client = OPCUAClient.create(options);
await client.connect(endpointUrl);
let userIdentity = {
type: UserTokenType.Certificate,
certificateData: fs.readFileSync('./user-certificates/bruce1.pem'),
privateKey: fs.readFileSync('./user-certificates/bruce1_key_nopass.pem','utf8')
}

const session = await client.createSession(userIdentity);
这导致成功连接到 prosys OPC-UA 客户端。我确信 future 可以进行一些改进,例如在 node.js 中进行密码解密。

关于x509 - 如何使用基于 node-opcua 的客户端连接到需要基于证书的用户身份验证的 OPC-UA 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64287152/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com