为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:dm v8
【操作系统】:windows 10
【CPU】:Intel i9
【问题描述】*:
使用typeorm-dm框架连接DM数据库,报连接失败: u [Error]: [6071] 消息加密失败,Error: Unknown cipher,连接参数如下:
import "reflect-metadata"
import { DmdbDataSource } from "typeorm-dm"
const AppDataSource = new DmdbDataSource({
type: "oracle", // TypeORM要求填写oracle
innerType: "dmdb", // 实际使用达梦
host: "localhost",
port: 5236, // 达梦默认端口
username: "WFPL",
password: "Pass001!",
schema: "WFPL", // 必须指定schema[5,8](@ref)
//url:"dm://WFPL:Pass001!@localhost:5236?schema=WFPL",
entities: [/* 你的实体类 */],
synchronize: true, // 开发环境可用
logging: true,
// 增加连接池配置
extra: {
connectTimeout: 30000, // 连接超时时间(毫秒)
poolMax: 10, // 连接池最大连接数
poolMin: 2, // 连接池最小连接数
poolTimeout: 30000, // 获取连接超时时间(毫秒)
// encrypt: false,
// cipher: "AES256"
}
})
export { AppDataSource };
将encrypt: false时,仍然报上述错误。dm.ini配置文件中的ENC_TYPE也设置为了0。
在连接字符串后加上loginEncrypt=false,解决了这个问题。连接字符串格式如下:
url: "dm://用户名:密码@服务器地址:端口?loginEncrypt=false", // 关键参数
请确认以下参数,关闭参数重启数据库服务端生效。
是否使用通信加密以DM数据库服务器端的设置为准,即通过设置服务器配置文件dm.ini中的ENABLE_ENCRYPT或者COMM_ENCRYPT_NAME参数来指定,ENABLE_ENCRYPT可以开启传输层通讯加密,COMM_ENCRYPT_NAME可以开启应用层消息通讯加密,两个层次上的加密是互不干扰,互不影响,可以同时开启这两个层次上的加密,也可以开启其中一个,如果开启传输层消息加密需要配置SSL证书。客户端以服务器采用的通信方式与其进行通信。
ENABLE_ENCRYPT:取值0、1和2,含义义分别为:
0表示在传输层不开启SSL认证和SSL通信加密;
1表示在传输层开启SSL认证和SSL通信加密;
2表示在传输层仅开启SSL认证,但不开启SSL加密。
COMM_ENCRYPT_NAME参数用来指定应用层消息通信的加密算法名,指定加密算法后,即可开启应用层通信加密(无需配置ENABLE_ENCRYPT)。如果为空则不进行通信加密;如果给的加密算法名错误,则使用加密算法DES_CFB。应用层的这种加密非常适合两端缺少数字证书的情况。
DM支持的加密算法名可以通过查询动态视图V$CIPHERS获取。