diff --git a/certs/README.md b/certs/README.md deleted file mode 100644 index 71f05b6..0000000 --- a/certs/README.md +++ /dev/null @@ -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. 证书文件是否已过期 diff --git a/scripts/auto-wechat-cert.sh b/scripts/auto-wechat-cert.sh new file mode 100755 index 0000000..7fb856b --- /dev/null +++ b/scripts/auto-wechat-cert.sh @@ -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 -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 <商户号> <私钥路径> <证书序列号> "); + 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 "$@" diff --git a/scripts/quick-wechat-cert.sh b/scripts/quick-wechat-cert.sh new file mode 100755 index 0000000..20ae7e5 --- /dev/null +++ b/scripts/quick-wechat-cert.sh @@ -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" diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 9af0143..4a377dd 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -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 diff --git a/src/main/resources/certs/dev/wechat/10550/apiclient_cert.p12 b/src/main/resources/certs/dev/wechat/10550/apiclient_cert.p12 new file mode 100644 index 0000000..bde6b5e Binary files /dev/null and b/src/main/resources/certs/dev/wechat/10550/apiclient_cert.p12 differ diff --git a/src/main/resources/certs/dev/wechat/10550/apiclient_cert.pem b/src/main/resources/certs/dev/wechat/10550/apiclient_cert.pem new file mode 100644 index 0000000..e3b8be8 --- /dev/null +++ b/src/main/resources/certs/dev/wechat/10550/apiclient_cert.pem @@ -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----- diff --git a/src/main/resources/certs/dev/wechat/10550/apiclient_key.pem b/src/main/resources/certs/dev/wechat/10550/apiclient_key.pem new file mode 100644 index 0000000..d3c1495 --- /dev/null +++ b/src/main/resources/certs/dev/wechat/10550/apiclient_key.pem @@ -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-----