# 认证

在开启TLS之后,客户端就可以验证连接的服务端的合法性,同时可以保证中间数据处于加密状态,但服务端无法验证客户的合法性,所以认证机制提供了一个服务端可以对可信的客户端进行验证的功能。

认证功能还提供了另一个功能,它可以赋予每个客户端一个角色名,hstream在这个基础上实现授权等功能。

hstream目前只支持基于TLS的认证功能,这是TLS的一个扩展, 为了启用TLS认证功能,你需要为一个角色创建密钥和证书, 然后把这个角色的密钥和证书交给可信的客户端, 这些客户端就可以通过这个绑定了相应角色的密钥和证书连接服务端。

# 创建一个可信角色

生成密钥:

openssl genrsa -out role01.key.pem 2048
1

把密钥转换成PKCS 8格式(Java客户端需要这种格式的密钥)

openssl pkcs8 -topk8 -inform PEM -outform PEM \
      -in role01.key.pem -out role01.key-pk8.pem -nocrypt
1
2

生成证书请求(填写Common Name时,需要填写角色名):

openssl req -config openssl.cnf \
      -key role01.key.pem -new -sha256 -out role01.csr.pem
1
2

生成签名证书:

openssl ca -config openssl.cnf -extensions usr_cert \
      -days 1000 -notext -md sha256 \
      -in role01.csr.pem -out signed.role01.cert.pem
1
2
3

# 配置

对于hstream服务端,你可以通过设置tls-ca-path来开启TLS认证功能,如:

# TLS options
#
# enable tls, which requires tls-key-path and tls-cert-path options
enable-tls: true
#
# key file path for tls, can be generated by openssl
tls-key-path: /path/to/the/server.key.pem
#
# the signed certificate by CA for the key(tls-key-path)
tls-cert-path: /path/to/the/signed.server.cert.pem
#
# optional for tls, if tls-ca-path is not empty, then enable TLS authentication,
# in the handshake phase,
# the server will request and verify the client's certificate.
tls-ca-path: /path/to/the/ca.cert.pem
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

Java客户端示例:

HStreamClient.builder()
  .serviceUrl(serviceUrl)
  // enable tls
  .enableTLS()
  .tlsCaPath("/path/to/ca.pem")
  
  // for authentication
  .enableTlsAuthentication()
  .tlsKeyPath("path/to/role01.key-pk8.pem")
  .tlsCertPath("path/to/signed.role01.cert.pem")
  
  .build()
1
2
3
4
5
6
7
8
9
10
11
12