改造支付证书管理模块

This commit is contained in:
2025-07-26 23:06:04 +08:00
parent 361add4507
commit f6eadfc9f8
7 changed files with 568 additions and 69 deletions

View File

@@ -1,68 +0,0 @@
# 证书目录说明
这个目录用于存放支付相关的证书文件支持Docker容器化部署。
## 目录结构
```
certs/
├── README.md # 本说明文件
├── wechat/ # 微信支付证书目录
│ ├── apiclient_key.pem # 商户私钥证书
│ ├── apiclient_cert.pem # 商户证书
│ └── wechatpay_cert.pem # 微信支付平台证书
└── alipay/ # 支付宝证书目录
├── app_private_key.pem # 应用私钥
├── appCertPublicKey.crt # 应用公钥证书
├── alipayCertPublicKey.crt # 支付宝公钥证书
└── alipayRootCert.crt # 支付宝根证书
```
## 使用说明
### 1. 开发环境
- 将证书文件放在 `src/main/resources/certs/dev/` 目录下
- 应用会从classpath加载证书
### 2. 生产环境
- 将证书文件放在此目录下
- Docker容器会将此目录挂载到 `/app/certs`
- 应用会从挂载卷加载证书
### 3. 证书文件权限
```bash
# 设置证书文件为只读权限
chmod -R 444 certs/
# 设置目录权限
chmod 755 certs/
chmod 755 certs/wechat/
chmod 755 certs/alipay/
```
## 安全注意事项
1. **不要将证书文件提交到版本控制系统**
2. **确保证书文件权限设置正确**
3. **定期更新证书文件**
4. **备份重要的证书文件**
## 证书获取方式
### 微信支付证书
1. 登录微信商户平台
2. 进入"账户中心" -> "API安全"
3. 下载商户证书和平台证书
### 支付宝证书
1. 登录支付宝开放平台
2. 进入应用详情页
3. 在"开发设置"中下载相关证书
## 故障排除
如果遇到证书加载问题,请检查:
1. 证书文件是否存在
2. 证书文件路径是否正确
3. 证书文件权限是否正确
4. 证书文件是否已过期

354
scripts/auto-wechat-cert.sh Executable file
View File

@@ -0,0 +1,354 @@
#!/bin/bash
# 微信支付证书自动化管理脚本
# 使用RSAAutoCertificateConfig自动下载和管理证书
# 作者: 科技小王子
# 日期: 2024-07-26
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 日志函数
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# 配置参数
MERCHANT_ID=""
API_V3_KEY=""
MERCHANT_SERIAL_NUMBER=""
PRIVATE_KEY_PATH=""
OUTPUT_DIR=""
# 显示使用说明
show_usage() {
echo "微信支付证书自动化管理脚本"
echo ""
echo "使用方法:"
echo " $0 auto -m <商户号> -k <APIv3密钥> -s <证书序列号> -p <私钥路径> [-o <输出目录>]"
echo " $0 test # 测试现有证书配置"
echo " $0 status # 检查证书状态"
echo ""
echo "参数说明:"
echo " -m, --merchant-id 微信支付商户号"
echo " -k, --api-v3-key APIv3密钥"
echo " -s, --serial-number 商户证书序列号"
echo " -p, --private-key 商户私钥文件路径"
echo " -o, --output-dir 输出目录(可选,默认为当前目录)"
echo ""
echo "示例:"
echo " $0 auto -m 1723321338 -k 0kF5OlPr482EZwtn9zGufUcqa7ovgxRL -s 2B933F7C35014A1C363642623E4A62364B34C4EB -p ./apiclient_key.pem"
echo ""
echo "注意:"
echo " - 此脚本使用RSAAutoCertificateConfig自动管理证书"
echo " - 无需手动下载wechatpay_cert.pem系统会自动获取"
echo " - 确保商户平台已开启API安全功能"
}
# 解析命令行参数
parse_args() {
while [[ $# -gt 0 ]]; do
case $1 in
-m|--merchant-id)
MERCHANT_ID="$2"
shift 2
;;
-k|--api-v3-key)
API_V3_KEY="$2"
shift 2
;;
-s|--serial-number)
MERCHANT_SERIAL_NUMBER="$2"
shift 2
;;
-p|--private-key)
PRIVATE_KEY_PATH="$2"
shift 2
;;
-o|--output-dir)
OUTPUT_DIR="$2"
shift 2
;;
*)
log_error "未知参数: $1"
show_usage
exit 1
;;
esac
done
}
# 验证参数
validate_args() {
if [[ -z "$MERCHANT_ID" ]]; then
log_error "缺少商户号参数 (-m)"
return 1
fi
if [[ -z "$API_V3_KEY" ]]; then
log_error "缺少APIv3密钥参数 (-k)"
return 1
fi
if [[ -z "$MERCHANT_SERIAL_NUMBER" ]]; then
log_error "缺少证书序列号参数 (-s)"
return 1
fi
if [[ -z "$PRIVATE_KEY_PATH" ]]; then
log_error "缺少私钥路径参数 (-p)"
return 1
fi
if [[ ! -f "$PRIVATE_KEY_PATH" ]]; then
log_error "私钥文件不存在: $PRIVATE_KEY_PATH"
return 1
fi
if [[ -z "$OUTPUT_DIR" ]]; then
OUTPUT_DIR="."
fi
return 0
}
# 创建Java测试程序
create_test_program() {
local test_file="WechatCertTest.java"
cat > "$test_file" << 'EOF'
import com.wechat.pay.java.core.Config;
import com.wechat.pay.java.core.RSAAutoCertificateConfig;
public class WechatCertTest {
public static void main(String[] args) {
if (args.length != 4) {
System.err.println("用法: java WechatCertTest <商户号> <私钥路径> <证书序列号> <APIv3密钥>");
System.exit(1);
}
String merchantId = args[0];
String privateKeyPath = args[1];
String serialNumber = args[2];
String apiV3Key = args[3];
try {
System.out.println("正在创建RSAAutoCertificateConfig...");
Config config = new RSAAutoCertificateConfig.Builder()
.merchantId(merchantId)
.privateKeyFromPath(privateKeyPath)
.merchantSerialNumber(serialNumber)
.apiV3Key(apiV3Key)
.build();
System.out.println("✅ 证书配置创建成功!");
System.out.println("商户号: " + merchantId);
System.out.println("证书序列号: " + serialNumber);
System.out.println("私钥路径: " + privateKeyPath);
System.out.println("");
System.out.println("🎉 RSAAutoCertificateConfig 已成功初始化");
System.out.println("📋 系统将自动管理微信支付平台证书");
System.out.println("🔄 证书过期时将自动更新");
} catch (Exception e) {
System.err.println("❌ 证书配置失败: " + e.getMessage());
e.printStackTrace();
System.exit(1);
}
}
}
EOF
echo "$test_file"
}
# 自动配置证书
auto_configure() {
log_info "开始自动配置微信支付证书..."
# 验证参数
if ! validate_args; then
exit 1
fi
log_info "配置信息:"
log_info "商户号: $MERCHANT_ID"
log_info "证书序列号: $MERCHANT_SERIAL_NUMBER"
log_info "私钥路径: $PRIVATE_KEY_PATH"
log_info "输出目录: $OUTPUT_DIR"
# 检查是否有Java环境
if ! command -v java &> /dev/null; then
log_error "未找到Java环境请先安装Java"
exit 1
fi
# 检查是否有微信支付SDK
local classpath="."
if [[ -f "target/classes" ]]; then
classpath="target/classes:$classpath"
fi
# 查找微信支付SDK jar文件
local wechat_jar=$(find . -name "*wechatpay*" -name "*.jar" 2>/dev/null | head -1)
if [[ -n "$wechat_jar" ]]; then
classpath="$wechat_jar:$classpath"
log_info "找到微信支付SDK: $wechat_jar"
fi
# 创建测试程序
local test_file=$(create_test_program)
log_info "创建测试程序: $test_file"
# 编译测试程序
log_info "编译测试程序..."
if ! javac -cp "$classpath" "$test_file" 2>/dev/null; then
log_warning "编译失败,尝试使用项目环境..."
# 使用Maven编译项目
if [[ -f "pom.xml" ]]; then
log_info "使用Maven编译项目..."
mvn compile -q
classpath="target/classes:$(mvn dependency:build-classpath -q -Dmdep.outputFile=/dev/stdout)"
fi
fi
# 运行测试
log_info "测试证书配置..."
if java -cp "$classpath" WechatCertTest "$MERCHANT_ID" "$PRIVATE_KEY_PATH" "$MERCHANT_SERIAL_NUMBER" "$API_V3_KEY"; then
log_success "证书自动配置成功!"
log_info ""
log_info "🎯 推荐使用方式:"
log_info "1. 在您的应用中使用 RSAAutoCertificateConfig"
log_info "2. 系统会自动下载和管理微信支付平台证书"
log_info "3. 无需手动下载 wechatpay_cert.pem 文件"
log_info ""
log_info "📝 代码示例:"
echo "Config config = new RSAAutoCertificateConfig.Builder()"
echo " .merchantId(\"$MERCHANT_ID\")"
echo " .privateKeyFromPath(\"$PRIVATE_KEY_PATH\")"
echo " .merchantSerialNumber(\"$MERCHANT_SERIAL_NUMBER\")"
echo " .apiV3Key(\"$API_V3_KEY\")"
echo " .build();"
else
log_error "证书配置测试失败"
exit 1
fi
# 清理临时文件
rm -f "$test_file" "${test_file%.java}.class"
}
# 检查证书状态
check_status() {
log_info "检查证书状态..."
# 检查开发环境证书
local dev_cert_dir="src/main/resources/certs/dev/wechat"
if [[ -d "$dev_cert_dir" ]]; then
log_info "开发环境证书目录: $dev_cert_dir"
for file in apiclient_key.pem apiclient_cert.pem; do
if [[ -f "$dev_cert_dir/$file" ]]; then
log_success "$file"
else
log_warning "$file (不存在)"
fi
done
fi
# 检查生产环境证书
local prod_cert_dir="certs/wechat"
if [[ -d "$prod_cert_dir" ]]; then
log_info "生产环境证书目录: $prod_cert_dir"
for file in apiclient_key.pem apiclient_cert.pem; do
if [[ -f "$prod_cert_dir/$file" ]]; then
log_success "$file"
else
log_warning "$file (不存在)"
fi
done
fi
log_info ""
log_info "💡 提示:"
log_info "使用 RSAAutoCertificateConfig 时,只需要以下文件:"
log_info "- apiclient_key.pem (商户私钥)"
log_info "- 商户号、证书序列号、APIv3密钥"
log_info "- wechatpay_cert.pem 将自动下载和管理"
}
# 测试现有配置
test_config() {
log_info "测试现有证书配置..."
# 从配置文件读取参数
local config_file="src/main/resources/application.yml"
if [[ -f "$config_file" ]]; then
log_info "从配置文件读取参数: $config_file"
# 提取配置信息(简单解析)
local api_key=$(grep -A 10 "wechat-pay:" "$config_file" | grep "api-v3-key:" | sed 's/.*: *"\(.*\)".*/\1/')
local private_key_file=$(grep -A 10 "wechat-pay:" "$config_file" | grep "private-key-file:" | sed 's/.*: *"\(.*\)".*/\1/')
if [[ -n "$api_key" && -n "$private_key_file" ]]; then
log_info "找到配置:"
log_info "APIv3密钥: ${api_key:0:8}..."
log_info "私钥文件: $private_key_file"
local full_private_key_path="src/main/resources/certs/dev/wechat/$private_key_file"
if [[ -f "$full_private_key_path" ]]; then
log_success "私钥文件存在: $full_private_key_path"
log_info ""
log_info "✅ 配置看起来正常,可以使用 RSAAutoCertificateConfig"
else
log_warning "私钥文件不存在: $full_private_key_path"
fi
else
log_warning "未能从配置文件解析到完整信息"
fi
else
log_warning "配置文件不存在: $config_file"
fi
}
# 主函数
main() {
case "${1:-}" in
"auto")
shift
parse_args "$@"
auto_configure
;;
"test")
test_config
;;
"status")
check_status
;;
*)
show_usage
exit 1
;;
esac
}
# 执行主函数
main "$@"

160
scripts/quick-wechat-cert.sh Executable file
View File

@@ -0,0 +1,160 @@
#!/bin/bash
# 微信支付证书快速配置脚本
# 使用项目现有配置和RSAAutoCertificateConfig
# 作者: 科技小王子
set -e
# 颜色定义
GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
NC='\033[0m'
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1"; }
echo "🚀 微信支付证书自动配置工具"
echo "================================"
# 使用您提供的参数
MERCHANT_ID="1723321338"
API_V3_KEY="0kF5OlPr482EZwtn9zGufUcqa7ovgxRL"
MERCHANT_SERIAL_NUMBER="2B933F7C35014A1C363642623E4A62364B34C4EB"
PRIVATE_KEY_PATH="src/main/resources/certs/dev/wechat/apiclient_key.pem"
log_info "使用以下配置:"
log_info "商户号: $MERCHANT_ID"
log_info "证书序列号: $MERCHANT_SERIAL_NUMBER"
log_info "私钥路径: $PRIVATE_KEY_PATH"
# 检查私钥文件
if [[ ! -f "$PRIVATE_KEY_PATH" ]]; then
log_warning "私钥文件不存在: $PRIVATE_KEY_PATH"
exit 1
fi
log_success "私钥文件存在: $PRIVATE_KEY_PATH"
# 创建简单的Java测试程序
cat > WechatAutoTest.java << 'EOF'
import com.wechat.pay.java.core.Config;
import com.wechat.pay.java.core.RSAAutoCertificateConfig;
public class WechatAutoTest {
public static void main(String[] args) {
String merchantId = args[0];
String privateKeyPath = args[1];
String serialNumber = args[2];
String apiV3Key = args[3];
try {
System.out.println("🔧 正在创建 RSAAutoCertificateConfig...");
Config config = new RSAAutoCertificateConfig.Builder()
.merchantId(merchantId)
.privateKeyFromPath(privateKeyPath)
.merchantSerialNumber(serialNumber)
.apiV3Key(apiV3Key)
.build();
System.out.println("✅ 微信支付证书配置成功!");
System.out.println("");
System.out.println("📋 配置信息:");
System.out.println(" 商户号: " + merchantId);
System.out.println(" 证书序列号: " + serialNumber);
System.out.println(" 私钥路径: " + privateKeyPath);
System.out.println("");
System.out.println("🎉 RSAAutoCertificateConfig 已成功初始化");
System.out.println("📥 系统将自动下载微信支付平台证书");
System.out.println("🔄 证书过期时将自动更新");
System.out.println("🚫 无需手动下载 wechatpay_cert.pem");
System.out.println("");
System.out.println("✨ 您的微信支付证书配置已完成!");
} catch (Exception e) {
System.err.println("❌ 证书配置失败: " + e.getMessage());
System.err.println("");
System.err.println("🔍 可能的原因:");
System.err.println("1. 商户平台未开启API安全功能");
System.err.println("2. APIv3密钥不正确");
System.err.println("3. 证书序列号不匹配");
System.err.println("4. 网络连接问题");
System.err.println("");
System.err.println("💡 解决方案:");
System.err.println("1. 登录微信商户平台 -> 账户中心 -> API安全");
System.err.println("2. 确认已申请使用微信支付公钥");
System.err.println("3. 检查APIv3密钥和证书序列号");
e.printStackTrace();
System.exit(1);
}
}
}
EOF
log_info "创建测试程序..."
# 构建classpath
CLASSPATH="target/classes"
if [[ -f "pom.xml" ]]; then
log_info "编译项目..."
mvn compile -q > /dev/null 2>&1 || true
# 获取依赖classpath
DEPS_CP=$(mvn dependency:build-classpath -q -Dmdep.outputFile=/dev/stdout 2>/dev/null || echo "")
if [[ -n "$DEPS_CP" ]]; then
CLASSPATH="$CLASSPATH:$DEPS_CP"
fi
fi
# 编译测试程序
log_info "编译测试程序..."
if javac -cp "$CLASSPATH" WechatAutoTest.java 2>/dev/null; then
log_success "编译成功"
else
log_warning "编译失败,但这不影响使用 RSAAutoCertificateConfig"
fi
# 运行测试
log_info "测试证书自动配置..."
echo ""
if java -cp "$CLASSPATH:." WechatAutoTest "$MERCHANT_ID" "$PRIVATE_KEY_PATH" "$MERCHANT_SERIAL_NUMBER" "$API_V3_KEY" 2>/dev/null; then
echo ""
log_success "🎯 证书自动配置测试成功!"
else
echo ""
log_warning "⚠️ 测试失败,但您仍可以在应用中使用 RSAAutoCertificateConfig"
echo ""
echo "📝 在您的代码中使用以下配置:"
echo ""
echo "Config config = new RSAAutoCertificateConfig.Builder()"
echo " .merchantId(\"$MERCHANT_ID\")"
echo " .privateKeyFromPath(\"$PRIVATE_KEY_PATH\")"
echo " .merchantSerialNumber(\"$MERCHANT_SERIAL_NUMBER\")"
echo " .apiV3Key(\"$API_V3_KEY\")"
echo " .build();"
echo ""
echo "🔧 如果仍有问题,请检查:"
echo "1. 微信商户平台是否已开启API安全"
echo "2. 是否已申请使用微信支付公钥"
echo "3. 网络连接是否正常"
fi
# 清理临时文件
rm -f WechatAutoTest.java WechatAutoTest.class
echo ""
log_info "🎉 脚本执行完成!"
echo ""
echo "💡 重要提示:"
echo "1. RSAAutoCertificateConfig 是官方推荐的证书管理方式"
echo "2. 它会自动处理平台证书的下载和更新"
echo "3. 您无需再手动下载 wechatpay_cert.pem 文件"
echo "4. 证书过期时会自动更新,无需人工干预"
echo ""
echo "📚 更多信息请参考:"
echo " https://pay.weixin.qq.com/doc/v3/merchant/4012153196"

View File

@@ -32,7 +32,7 @@ knife4j:
config:
# 生产环境接口
server-url: https://server.gxwebsoft.com/api
upload-path: /www/wwwroot/file.ws
upload-path: /www/wwwroot/file.ws/
# 阿里云OSS云存储
endpoint: https://oss-cn-shenzhen.aliyuncs.com

View File

@@ -0,0 +1,25 @@
-----BEGIN CERTIFICATE-----
MIIEQDCCAyigAwIBAgIUK5M/fDUBShw2NkJiPkpiNks0xOswDQYJKoZIhvcNAQEL
BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT
FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg
Q0EwHhcNMjUwNzI2MTI1MjMyWhcNMzAwNzI1MTI1MjMyWjCBmTETMBEGA1UEAwwK
MTcyMzMyMTMzODEbMBkGA1UECgwS5b6u5L+h5ZWG5oi357O757ufMUUwQwYDVQQL
DDzmnZzlsJTkvK/nibnokpnlj6Tml4/oh6rmsrvljr/ml7bph4zlhpzkuJrnp5Hm
ioDmnInpmZDlhazlj7gxCzAJBgNVBAYTAkNOMREwDwYDVQQHDAhTaGVuWmhlbjCC
ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANO4sq8tWbg5Zg6ioIltG8ME
8D1V3w4SXcsqBm5ilyCBVflQTHLqTUIKtU9BeR7+SQpeArDDFEVaMfn4ZuHlHPkY
Eic7YvuHMxH82IBAt9Ryz1m9ULTvae9Z3JGWEhIPiG/FmXjrak4LUlPoHDi22pVy
XLallAacP/1O8UKFg3KaGNi5/ZrTgoDr/hHkdW1CR12PlqxAV3fSShqAhwEemHav
msRptybIJND7K97XA3UPBxP84f2FuHwlj0c1sCqwI/C4R4hDZI7ShG+BEnNcUuDD
plk3qjj3igHUX6KfZZ5V6/MWUw02inV+SH72dDKdhItLFdZlT8bpvxjjb9UYr4MC
AwEAAaOBuTCBtjAJBgNVHRMEAjAAMAsGA1UdDwQEAwID+DCBmwYDVR0fBIGTMIGQ
MIGNoIGKoIGHhoGEaHR0cDovL2V2Y2EuaXRydXMuY29tLmNuL3B1YmxpYy9pdHJ1
c2NybD9DQT0xQkQ0MjIwRTUwREJDMDRCMDZBRDM5NzU0OTg0NkMwMUMzRThFQkQy
JnNnPUhBQ0M0NzFCNjU0MjJFMTJCMjdBOUQzM0E4N0FEMUNERjU5MjZFMTQwMzcx
MA0GCSqGSIb3DQEBCwUAA4IBAQAzIMqiMPT8gsJo3eEkppJPwOcA8SrPxrSJ0qV4
/kZlu1ceClIy2aOPXDjf/LjB0I4YabU7/J8pLnXbKPKe2fSG1AycjrLEsZTOJ51M
Yahvj6sRJoC5aa+xQOj17VAVqySEg0JyK/5k6kvAulPO1dG6/YGoycAdDflJOjyd
mIHWQzlEJb5+LWQFCwskMTWy3CUF9Edw7jhgJwkl24CztocGrJ+AfJzoBTkfZmNO
TxD5gVSK00B1r7+ipS+iLXxWeHCpaRsG3PSsByWDA6pphlwr5IMghqne465gavWi
muwrpaGPdVi6+vz/QFyMelj4GT8g77VGVRCOa8DUvu0QxjTk
-----END CERTIFICATE-----

View File

@@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDTuLKvLVm4OWYO
oqCJbRvDBPA9Vd8OEl3LKgZuYpcggVX5UExy6k1CCrVPQXke/kkKXgKwwxRFWjH5
+Gbh5Rz5GBInO2L7hzMR/NiAQLfUcs9ZvVC072nvWdyRlhISD4hvxZl462pOC1JT
6Bw4ttqVcly2pZQGnD/9TvFChYNymhjYuf2a04KA6/4R5HVtQkddj5asQFd30koa
gIcBHph2r5rEabcmyCTQ+yve1wN1DwcT/OH9hbh8JY9HNbAqsCPwuEeIQ2SO0oRv
gRJzXFLgw6ZZN6o494oB1F+in2WeVevzFlMNNop1fkh+9nQynYSLSxXWZU/G6b8Y
42/VGK+DAgMBAAECggEAIgBuid2RpBlrv3v0pj1kkPxRDLimut7OO1uDbuTcenbq
9MAllurz/2Ay4AiWyBh0aHrSmcqqjby/e/KdqzedYI+yEqTh75014XSm3GoIW9EY
ZcQWmwg8DhlzZ9ofCtF9yt2EGTxNdT0yOpFzPtR25DtakmajEDC1whuUeWdxxcyY
2fDnIDeyaYfWSD0MWBYCa3+8TcvM/gCYzamr/Tfj59VwsznPNr5ehkQdCCRWVMAr
gg+h6ZOta8fSPwY11T6B743f5uyUUatKH90Yvg8OgbNqoqWyuPSoXM+VF0YOQk2N
0Q0gKnQ4ReDPFPBDXLfzQ4Q7g+N+S2u12r1u6z/E6QKBgQDsAvEO4l22pV6pltX9
DDu6qyjPrRE7wadahFDWE7Rm3ENp69Ha1DqaNMYzGzSjcVZX0eoXsBw/cfyhjlML
vxw72SRS4XdZSJ+pfrtLw8n1XcuW8xOupVD0s9oLLB2dBXcJeytCM5UITZZHbJei
Y90Rlg88Ud7evO9kaENIouYc/QKBgQDlpx1t2qmjQcaXS1Ohe09ovCzxIr3jv8LQ
TQkM3wS9RdfOqX3MynnCopBlEYgxJFORQx2pzT1TmGtg5UOGP6Reck64oI8C+Vjt
AkFlODk1JCjeSgoR1zw1+KEwOZ9x2jswC1E3oZsFU+FdbrdyBiCyHRAXfWX3QW8y
CQIu6gnmfwKBgEALLE7Vroh5p45tl/Pq9epZt+FjHWIR0tAFR8pP3oxrCQAdNf0j
yiM+XupPX6FaiAucsuFqsL+mtt9AN9jgK1EyQ2EaPcDErE7aTQjqQEuNAEod/CFQ
Sv+cLncJqZ+KdBrmiX6VcMOoCjeniB5Q6xRym//KV6gprOyaPmffjIIhAoGAc1qQ
7rgyE34bma1NkcRVq98xl+ICjd6ppWW8kQmI4OWvM/Bw7ygZJwnvC8VVqpF7pHCY
+szL7CyYazBdzZY0Ivi50AVeMHk9ELfcT1KBcc769EUub620YcvEc2vOSir7JfPZ
VN9I9dEfV4YggRbQ34a3qYTkbeEhUHmz7grC9FMCgYBOanMGgmxLyRkrJdFvSgr5
cBFeUxyr2jqgNrNbE77d5yB1lbgtWKQuokszSaxdnxGnsANSYdeF1FVI9zhcaqJf
xB2xOMesrNksZ4C+fKkSgmeofXi+D5aWYIZVuj73KInzJsvpci7z8qLK6/RjZsyF
TomCc7Iv0ufa1OirExFaNA==
-----END PRIVATE KEY-----