农村小老者 發表於 2025-11-12 09:27:48

SQL Server驱动和TLS版本不兼容的原因分析和解决方案

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">一、问题描述</a></li><li><a href="#_label1">二、原因分析:</a></li><li><a href="#_label2">三、解决方案</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_0">3.1 服务器本地解决方案</a></li><li><a href="#_lab2_2_1">3.2 Docker容器部署解决方案</a></li></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>一、问题描述</h2>
<p>声明:java程序是docker容器化部署的&nbsp;<strong>进行期初数据定时同步功能,sql server同步至mysql中,本地调用正常,发到服务器环境就会报错如下</strong></p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202511/2025111209252466.png" /></p>
<div class="jb51code"><pre class="brush:bash;">- java.security path: /usr/local/openjdk-8/jre/lib/security
Security providers: [SUN version 1.8, SunRsaSign version 1.8, SunEC version 1.8, SunJSSE version 1.8, SunJCE         vers1on 1.8,
SunJGSS version 1.8, SunSASL version 1.8, )
XMLDSig version 1.8, SunPCSC version 1.8]
SSLContext provider info: Sun JSSE provider(PKCS12, SunX509/PKIX key/trust factories,
SSLv3/TLSv1/TLSvl.1/TLSvl.2/TLSvl.3)
SSLContext provider services:
</pre></div>
<p>配置文件如下:</p>
<div class="jb51code"><pre class="brush:yaml;"># 动态数据源配置
datasource:
    dynamic:
      primary: master
      datasource:
      slave:
          url: jdbc:sqlserver://192.168.0.1:1433;DatabaseName=test
          username: root
          password: xxxxxxx
          driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
</pre></div>
<div class="jb51code"><pre class="brush:xml;">&lt;!-- sqlserver驱动 --&gt;
&lt;dependency&gt;
   &lt;groupId&gt;com.microsoft.sqlserver&lt;/groupId&gt;
   &lt;artifactId&gt;sqljdbc4&lt;/artifactId&gt;
   &lt;version&gt;4.0&lt;/version&gt;
&lt;/dependency&gt;
</pre></div>
<p class="maodian"><a name="_label1"></a></p><h2>二、原因分析:</h2>
<p><strong>这是一个Java安全配置相关的信息输出,通常是在启动应用或检查SSL配置时出现的。</strong></p>
<p>通过异常信息可以看出</p>
<ul><li>Java安全文件路径: <code>/usr/local/openjdk-8/jre/lib/security</code></li><li>Java版本: <code>OpenJDK 8</code></li><li>显示TLS/SSL支持的协议版本:<code>SSLv3, TLSv1, TLSv1.1, TLSv1.2, TLSv1.3</code></li></ul>
<p>检测到当前数据库使用的协商使用的是 TLSv1 协议,而项目中使用的时jdk8,它的协议版本高,不兼容 TLSv1 协议。<br />不能改其他项目的数据库的版本,则更改jdk安全配置文件java.security。</p>
<p class="maodian"><a name="_label2"></a></p><h2>三、解决方案</h2>
<p class="maodian"><a name="_lab2_2_0"></a></p><h3>3.1 服务器本地解决方案</h3>
<p>修改java.security文件</p>
<p><strong>放宽TLS/SSL的安全限制,解决某些老系统或内部系统连接时的兼容性问题</strong><br /># 移除了 TLSv1, TLSv1.1 的禁用</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202511/2025111209252469.png" /></p>
<p>修改前</p>
<div class="jb51code"><pre class="brush:bash;">jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \
    DH keySize &lt; 1024, EC keySize &lt; 224, 3DES_EDE_CBC, anon, NULL, \
    include jdk.disabled.namedCurves
</pre></div>
<p>修改后(放宽策略):</p>
<div class="jb51code"><pre class="brush:sql;">jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA,\
       DH keySize &lt; 1024, EC keySize &lt; 224, anon, NULL, ECDH
</pre></div>
<p class="maodian"><a name="_lab2_2_1"></a></p><h3>3.2 Docker容器部署解决方案</h3>
<p>因为每次Jenkins部署,都会根据Dockerfile生成新的镜像和启动容器,修改需要修改容器内的安全文件,不可能每次发版都改所以修改Dockerfile文件</p>
<div class="jb51code"><pre class="brush:bash;">FROM openjdk:8-jdk
ADD app/target/app.jar /app/app.jar
RUN sed -i 's/^jdk.tls.disabledAlgorithms=.*/jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, DH keySize &lt; 1024, EC keySize &lt; 224, anon, NULL, ECDH/' /usr/local/openjdk-8/jre/lib/security/java.security
RUN echo 'Asia/Shanghai' &gt;/etc/timezone
ENV JAVA_OPTS=""
ENV JAVA_ACTIVE=""
ENTRYPOINT exec java ${JAVA_OPTS} -jar ${JAVA_ACTIVE} /app/jb-access-server-business.jar
EXPOSE 35010
</pre></div>
<p>最主要就是<code>RUN sed</code>这行</p>
<ul><li><code>sed</code>: 流编辑器,用于文本处理</li><li><code>-i</code> : 直接修改原文件</li></ul>
<div class="jb51code"><pre class="brush:sql;">'s/^jdk.tls.disabledAlgorithms=.*/新的值/'
</pre></div>
<p>s/原内容/新内容/: 替换命令<br />^jdk.tls.disabledAlgorithms=.*: 匹配以&quot;jdk.tls.disabledAlgorithms=&quot;开头的整行</p>
頁: [1]
查看完整版本: SQL Server驱动和TLS版本不兼容的原因分析和解决方案