1、生成服务器证书,服务器使用自签名证书
openssl genrsa - out ?server-key.pem 2048 openssl req - new ?-sha256 -key server-key.pem - out ?server-csr.pem???? //在CN处填写服务器主机名localhost openssl x509 -req - in ?server-csr.pem -signkey server-key.pem - out ?server-cert.pem |
2、将服务器私钥server-key.pem和CA根证书server-cert.pem复制到客户端,然后生成客户端证书
openssl genrsa -out ?client-key.pem 2048 openssl req - new ?-sha256 -key client-key.pem - out ?client-csr.pem???? //在CN出填写客户端localhost openssl x509 -req -CA server-cert.pem -CAkey server-key.pem -CAcreateserial - in ?client-csr.pem - out ?client-cert.pem |
3、 server.js
const tls = require('tls');
const fs = require('fs');
const options = {
key: fs.readFileSync('server-key.pem'),
cert: fs.readFileSync('server-cert.pem'),
// 这仅在使用客户端证书身份验证时才需要。
requestCert: true,
// 仅当客户端使用自签名证书时才需要这样做。
ca: [ fs.readFileSync('client-cert.pem') ]
};
const server = tls.createServer(options, (socket) => {
console.log('server connected',
socket.authorized ? 'authorized' : 'unauthorized');
socket.write('welcome!\n');
socket.setEncoding('utf8');
// socket.pipe(socket);socket是双工流
socket.on('data',function (data){
console.log(data)
})
process.stdin.pipe(socket);
});
server.listen(8000, () => {
console.log('server bound');
});
4、client.js
const tls = require('tls');
const fs = require('fs');
const options = {
// 仅当服务器需要客户端证书身份验证时才需要。
key: fs.readFileSync('client-key.pem'),
cert: fs.readFileSync('client-cert.pem'),
// 仅当服务器使用自签名证书时才需要。
ca: [ fs.readFileSync('server-cert.pem') ],
// 仅当服务器的证书不适用于 "localhost" 时才需要。
checkServerIdentity: () => { return null; },
};
const socket = tls.connect(8000, options, () => {
console.log('client connected',
socket.authorized ? 'authorized' : 'unauthorized');
process.stdin.pipe(socket);
// socket.pipe(socket)
process.stdin.resume();
});
socket.setEncoding('utf8');
socket.on('data', (data) => {
console.log(data);
});
socket.on('end', () => {
console.log('server ends connection');
});
先启动server,再启动client,server端便能和client端进行消息通信了
|