Feat, support SSL(TLS), improve SHA2 password. (#5147)

* feat #4489, mysql SSL

* feat #4489, mysql SHA2 and SSL

* merge master, fix conflict.

* improve SHA2 auth plugin, fix SSL status print.

* SSL key store, use url rather than path, keep same as JDBC driver.
This commit is contained in:
dingxiaobo
2024-06-26 15:06:16 +08:00
committed by GitHub
parent 7bb619cf12
commit 5c61f2fb56
28 changed files with 958 additions and 114 deletions

View File

@@ -276,8 +276,7 @@ public class CanalInstanceWithManager extends AbstractCanalInstance {
mysqlEventParser.setDestination(destination);
// 编码参数
mysqlEventParser.setConnectionCharset(parameters.getConnectionCharset());
mysqlEventParser.setConnectionCharsetNumber(parameters.getConnectionCharsetNumber());
// 网络相关参数
// 网络相关参数1
mysqlEventParser.setDefaultConnectionTimeoutInSeconds(parameters.getDefaultConnectionTimeoutInSeconds());
mysqlEventParser.setSendBufferSize(parameters.getSendBufferSize());
mysqlEventParser.setReceiveBufferSize(parameters.getReceiveBufferSize());
@@ -291,13 +290,15 @@ public class CanalInstanceWithManager extends AbstractCanalInstance {
mysqlEventParser.setMasterInfo(new AuthenticationInfo(dbAddresses.get(0),
parameters.getDbUsername(),
parameters.getDbPassword(),
parameters.getDefaultDatabaseName()));
parameters.getDefaultDatabaseName(),
parameters.getSslInfo()));
if (dbAddresses.size() > 1) {
mysqlEventParser.setStandbyInfo(new AuthenticationInfo(dbAddresses.get(1),
parameters.getDbUsername(),
parameters.getDbPassword(),
parameters.getDefaultDatabaseName()));
parameters.getDefaultDatabaseName(),
parameters.getSslInfo()));
}
}
@@ -369,7 +370,6 @@ public class CanalInstanceWithManager extends AbstractCanalInstance {
localBinlogEventParser.setDestination(destination);
localBinlogEventParser.setBufferSize(parameters.getReceiveBufferSize());
localBinlogEventParser.setConnectionCharset(parameters.getConnectionCharset());
localBinlogEventParser.setConnectionCharsetNumber(parameters.getConnectionCharsetNumber());
localBinlogEventParser.setDirectory(parameters.getLocalBinlogDirectory());
localBinlogEventParser.setProfilingEnabled(false);
localBinlogEventParser.setDetectingEnable(parameters.getDetectingEnable());
@@ -381,7 +381,8 @@ public class CanalInstanceWithManager extends AbstractCanalInstance {
localBinlogEventParser.setMasterInfo(new AuthenticationInfo(dbAddresses.get(0),
parameters.getDbUsername(),
parameters.getDbPassword(),
parameters.getDefaultDatabaseName()));
parameters.getDefaultDatabaseName(),
parameters.getSslInfo()));
}
eventParser = localBinlogEventParser;

View File

@@ -9,6 +9,8 @@ import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.builder.ToStringBuilder;
import com.alibaba.otter.canal.common.utils.CanalToStringStyle;
import com.alibaba.otter.canal.parse.driver.mysql.ssl.SslInfo;
import com.alibaba.otter.canal.parse.driver.mysql.ssl.SslMode;
/**
* canal运行相关参数
@@ -56,8 +58,6 @@ public class CanalParameter implements Serializable {
private Integer defaultConnectionTimeoutInSeconds = 30; // sotimeout
private Integer receiveBufferSize = 64 * 1024;
private Integer sendBufferSize = 64 * 1024;
// 编码信息
private Byte connectionCharsetNumber = (byte) 33;
private String connectionCharset = "UTF-8";
// 数据库信息
@@ -66,6 +66,15 @@ public class CanalParameter implements Serializable {
private String dbUsername; // 数据库用户
private String dbPassword; // 数据库密码
private String sslMode = SslMode.DISABLED.name();
private String tlsVersions; // 和 enabledTLSProtocols 同含义,TLSv1.2,TLSv1.3
private String trustCertificateKeyStoreType; // trustStore 证书类型,支持 JKS (默认) 和 PKCS12
private String trustCertificateKeyStoreUrl; // trustStore 证书路径
private String trustCertificateKeyStorePassword; // trustStore 证书密码
private String clientCertificateKeyStoreType; // client 证书类型,支持 JKS (默认) 和 PKCS12
private String clientCertificateKeyStoreUrl; // client 证书路径
private String clientCertificateKeyStorePassword; // client 证书密码
// binlog链接信息
private IndexMode indexMode;
private List<String> positions; // 数据库positions信息
@@ -108,10 +117,27 @@ public class CanalParameter implements Serializable {
private InetSocketAddress masterAddress; // 主库信息
private String masterUsername; // 帐号
private String masterPassword; // 密码
private String masterSslMode = SslMode.DISABLED.name();
private String masterTlsVersions; // 和 enabledTLSProtocols 同含义,TLSv1.2,TLSv1.3
private String masterTrustCertificateKeyStoreType; // trustStore 证书类型,支持 JKS (默认) 和 PKCS12
private String masterTrustCertificateKeyStoreUrl; // trustStore 证书路径
private String masterTrustCertificateKeyStorePassword; // trustStore 证书密码
private String masterClientCertificateKeyStoreType; // client 证书类型,支持 JKS (默认) 和 PKCS12
private String masterClientCertificateKeyStoreUrl; // client 证书路径
private String masterClientCertificateKeyStorePassword; // client 证书密码
private InetSocketAddress standbyAddress; // 备库信息
private String standbyUsername; // 帐号
private String standbyPassword;
private String standbySslMode = SslMode.DISABLED.name();
private String standbyTlsVersions; // 和 enabledTLSProtocols 同含义,TLSv1.2,TLSv1.3
private String standbyTrustCertificateKeyStoreType; // trustStore 证书类型,支持 JKS (默认) 和 PKCS12
private String standbyTrustCertificateKeyStoreUrl; // trustStore 证书路径
private String standbyTrustCertificateKeyStorePassword; // trustStore 证书密码
private String standbyClientCertificateKeyStoreType; // client 证书类型,支持 JKS (默认) 和 PKCS12
private String standbyClientCertificateKeyStoreUrl; // client 证书路径
private String standbyClientCertificateKeyStorePassword; // client 证书密码
private String masterLogfileName = null; // master起始位置
private Long masterLogfileOffest = null;
private Long masterTimestamp = null;
@@ -533,14 +559,6 @@ public class CanalParameter implements Serializable {
this.sendBufferSize = sendBufferSize;
}
public Byte getConnectionCharsetNumber() {
return connectionCharsetNumber;
}
public void setConnectionCharsetNumber(Byte connectionCharsetNumber) {
this.connectionCharsetNumber = connectionCharsetNumber;
}
public String getConnectionCharset() {
return connectionCharset;
}
@@ -685,16 +703,16 @@ public class CanalParameter implements Serializable {
groupDbAddresses.add(groupAddresses);
}
} else {
if (masterAddress != null) {
List<DataSourcing> groupAddresses = new ArrayList<>();
if (masterAddress != null) {
List<DataSourcing> groupAddresses = new ArrayList<>();
groupAddresses.add(new DataSourcing(sourcingType, masterAddress));
groupDbAddresses.add(groupAddresses);
}
groupDbAddresses.add(groupAddresses);
}
if (standbyAddress != null) {
List<DataSourcing> groupAddresses = new ArrayList<>();
if (standbyAddress != null) {
List<DataSourcing> groupAddresses = new ArrayList<>();
groupAddresses.add(new DataSourcing(sourcingType, standbyAddress));
groupDbAddresses.add(groupAddresses);
groupDbAddresses.add(groupAddresses);
}
}
}
@@ -731,6 +749,134 @@ public class CanalParameter implements Serializable {
this.dbPassword = dbPassword;
}
public SslInfo getSslInfo() {
if (dbUsername == null) {
if (masterUsername != null) {
return new SslInfo(SslMode.valueOf(masterSslMode),
masterTlsVersions,
masterTrustCertificateKeyStoreType,
masterTrustCertificateKeyStoreUrl,
masterTrustCertificateKeyStorePassword,
masterClientCertificateKeyStoreType,
masterClientCertificateKeyStoreUrl,
masterClientCertificateKeyStorePassword);
} else {
return new SslInfo(SslMode.valueOf(standbySslMode),
standbyTlsVersions,
standbyTrustCertificateKeyStoreType,
standbyTrustCertificateKeyStoreUrl,
standbyTrustCertificateKeyStorePassword,
standbyClientCertificateKeyStoreType,
standbyClientCertificateKeyStoreUrl,
standbyClientCertificateKeyStorePassword);
}
}
return new SslInfo(SslMode.valueOf(sslMode),
tlsVersions,
trustCertificateKeyStoreType,
trustCertificateKeyStoreUrl,
trustCertificateKeyStorePassword,
clientCertificateKeyStoreType,
clientCertificateKeyStoreUrl,
clientCertificateKeyStorePassword);
}
public void setSslMode(String sslMode) {
this.sslMode = sslMode;
}
public void setTlsVersions(String tlsVersions) {
this.tlsVersions = tlsVersions;
}
public void setTrustCertificateKeyStoreType(String trustCertificateKeyStoreType) {
this.trustCertificateKeyStoreType = trustCertificateKeyStoreType;
}
public void setTrustCertificateKeyStoreUrl(String trustCertificateKeyStoreUrl) {
this.trustCertificateKeyStoreUrl = trustCertificateKeyStoreUrl;
}
public void setTrustCertificateKeyStorePassword(String trustCertificateKeyStorePassword) {
this.trustCertificateKeyStorePassword = trustCertificateKeyStorePassword;
}
public void setClientCertificateKeyStoreType(String clientCertificateKeyStoreType) {
this.clientCertificateKeyStoreType = clientCertificateKeyStoreType;
}
public void setClientCertificateKeyStoreUrl(String clientCertificateKeyStoreUrl) {
this.clientCertificateKeyStoreUrl = clientCertificateKeyStoreUrl;
}
public void setClientCertificateKeyStorePassword(String clientCertificateKeyStorePassword) {
this.clientCertificateKeyStorePassword = clientCertificateKeyStorePassword;
}
public void setMasterSslMode(String masterSslMode) {
this.masterSslMode = masterSslMode;
}
public void setMasterTlsVersions(String masterTlsVersions) {
this.masterTlsVersions = masterTlsVersions;
}
public void setMasterTrustCertificateKeyStoreType(String masterTrustCertificateKeyStoreType) {
this.masterTrustCertificateKeyStoreType = masterTrustCertificateKeyStoreType;
}
public void setMasterTrustCertificateKeyStoreUrl(String masterTrustCertificateKeyStoreUrl) {
this.masterTrustCertificateKeyStoreUrl = masterTrustCertificateKeyStoreUrl;
}
public void setMasterTrustCertificateKeyStorePassword(String masterTrustCertificateKeyStorePassword) {
this.masterTrustCertificateKeyStorePassword = masterTrustCertificateKeyStorePassword;
}
public void setMasterClientCertificateKeyStoreType(String masterClientCertificateKeyStoreType) {
this.masterClientCertificateKeyStoreType = masterClientCertificateKeyStoreType;
}
public void setMasterClientCertificateKeyStoreUrl(String masterClientCertificateKeyStoreUrl) {
this.masterClientCertificateKeyStoreUrl = masterClientCertificateKeyStoreUrl;
}
public void setMasterClientCertificateKeyStorePassword(String masterClientCertificateKeyStorePassword) {
this.masterClientCertificateKeyStorePassword = masterClientCertificateKeyStorePassword;
}
public void setStandbySslMode(String standbySslMode) {
this.standbySslMode = standbySslMode;
}
public void setStandbyTlsVersions(String standbyTlsVersions) {
this.standbyTlsVersions = standbyTlsVersions;
}
public void setStandbyTrustCertificateKeyStoreType(String standbyTrustCertificateKeyStoreType) {
this.standbyTrustCertificateKeyStoreType = standbyTrustCertificateKeyStoreType;
}
public void setStandbyTrustCertificateKeyStoreUrl(String standbyTrustCertificateKeyStoreUrl) {
this.standbyTrustCertificateKeyStoreUrl = standbyTrustCertificateKeyStoreUrl;
}
public void setStandbyTrustCertificateKeyStorePassword(String standbyTrustCertificateKeyStorePassword) {
this.standbyTrustCertificateKeyStorePassword = standbyTrustCertificateKeyStorePassword;
}
public void setStandbyClientCertificateKeyStoreType(String standbyClientCertificateKeyStoreType) {
this.standbyClientCertificateKeyStoreType = standbyClientCertificateKeyStoreType;
}
public void setStandbyClientCertificateKeyStoreUrl(String standbyClientCertificateKeyStoreUrl) {
this.standbyClientCertificateKeyStoreUrl = standbyClientCertificateKeyStoreUrl;
}
public void setStandbyClientCertificateKeyStorePassword(String standbyClientCertificateKeyStorePassword) {
this.standbyClientCertificateKeyStorePassword = standbyClientCertificateKeyStorePassword;
}
public List<String> getPositions() {
if (positions == null) {
positions = new ArrayList<>();

View File

@@ -114,7 +114,6 @@
<property name="defaultConnectionTimeoutInSeconds" value="${canal.instance.network.soTimeout:30}" />
<!-- 解析编码 -->
<!-- property name="connectionCharsetNumber" value="${canal.instance.connectionCharsetNumber:33}" /-->
<property name="connectionCharset" value="${canal.instance.connectionCharset:UTF-8}" />
<!-- 解析位点记录 -->

View File

@@ -100,7 +100,6 @@
<property name="defaultConnectionTimeoutInSeconds" value="${canal.instance.network.soTimeout:30}" />
<!-- 解析编码 -->
<!-- property name="connectionCharsetNumber" value="${canal.instance.connectionCharsetNumber:33}" /-->
<property name="connectionCharset" value="${canal.instance.connectionCharset:UTF-8}" />
<!-- 解析位点记录 -->

View File

@@ -106,7 +106,6 @@
<property name="defaultConnectionTimeoutInSeconds" value="${canal.instance.network.soTimeout:30}" />
<!-- 解析编码 -->
<!-- property name="connectionCharsetNumber" value="${canal.instance.connectionCharsetNumber:33}" /-->
<property name="connectionCharset" value="${canal.instance.connectionCharset:UTF-8}" />
<!-- 解析位点记录 -->
@@ -186,7 +185,6 @@
<property name="defaultConnectionTimeoutInSeconds" value="${canal.instance.network.soTimeout:30}" />
<!-- 解析编码 -->
<!-- property name="connectionCharsetNumber" value="${canal.instance.connectionCharsetNumber:33}" /-->
<property name="connectionCharset" value="${canal.instance.connectionCharset:UTF-8}" />
<!-- 解析位点记录 -->

View File

@@ -97,7 +97,6 @@
<property name="defaultConnectionTimeoutInSeconds" value="${canal.instance.network.soTimeout:30}" />
<!-- 解析编码 -->
<!-- property name="connectionCharsetNumber" value="${canal.instance.connectionCharsetNumber:33}" /-->
<property name="connectionCharset" value="${canal.instance.connectionCharset:UTF-8}" />
<!-- 解析位点记录 -->