首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用基于node-opcua的客户端连接到需要基于证书的用户身份验证的OPC-UA服务器

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

Stack Overflow用户
提问于 2020-10-10 04:50:52
回答 1查看 1.2K关注 0票数 3

我正在使用node-opcua库构建一个OPC UA客户端。我已经使用了基本示例连接到OPC-UA服务器(prosys OPC-UA模拟服务器),但现在我想让我的客户机支持各种身份验证方法。

我可以使用以下代码进行基于用户名+密码的身份验证:

代码语言:javascript
复制
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生成证书的指导?

EN

回答 1

Stack Overflow用户

发布于 2020-10-10 05:34:47

所以我想通了!这是给任何想要它的人(或者我未来的自己)的答案。

首先,看起来证书需要有正确的用法和扩展。当我生成一个没有这些证书的证书时,它不工作。创建一个名为user-key.conf的文件,其内容类似于:

代码语言:javascript
复制
[ 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中,以下代码将使用生成的证书文件进行连接:

代码语言:javascript
复制
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客户端。我相信将来会有一些改进,比如在node.js中进行密码短语解密。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64287152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档