<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>绿色记忆 &#187; SSL</title>
	<atom:link href="https://blog.gmem.cc/tag/ssl/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.gmem.cc</link>
	<description></description>
	<lastBuildDate>Thu, 16 Apr 2026 07:10:45 +0000</lastBuildDate>
	<language>en-US</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.9.14</generator>
	<item>
		<title>Apache HTTP Server知识集锦</title>
		<link>https://blog.gmem.cc/apache-http-server-faq</link>
		<comments>https://blog.gmem.cc/apache-http-server-faq#comments</comments>
		<pubDate>Mon, 21 Sep 2015 03:42:42 +0000</pubDate>
		<dc:creator><![CDATA[Alex]]></dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[SSL]]></category>

		<guid isPermaLink="false">http://blog.gmem.cc/?p=8524</guid>
		<description><![CDATA[<p>基本概念 名词 说明 MPM Apache2引入的特性，即多处理模块（Multi-Processing Modules）。MPM是Apache用来处理网络请求的模块，其功能包括：绑定网络端口、接受请求、分发给子例程执行请求处理 引入MPM，可以实现针对平台、针对业务场景的优化： 对于Windows平台，默认使用mpm_winnt，从而避免了Apache 1.3中的POSIX抽象层 对于高可扩容性场景，可以使用基于线程的MPM，例如worker或者event 如果需要稳定性、对老软件的兼容性，可以使用prefork 要查看当前使用的MPM，可以使用命令： [crayon-69e09a4b1c36a327531860/] 在同一时刻，只能有一个MPM被加载。 默认使用的MPM取决于Apache的编译配置选项[crayon-69e09a4b1c373671964019-i/]  安装 Ubuntu 14.04 安装必要的软件 [crayon-69e09a4b1c376331516465/] 启用rewrite模块 [crayon-69e09a4b1c379136700104/] <a class="read-more" href="https://blog.gmem.cc/apache-http-server-faq">[...]</a></p>
<p>The post <a rel="nofollow" href="https://blog.gmem.cc/apache-http-server-faq">Apache HTTP Server知识集锦</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="wri_content_clear_both"><div class="blog_h1"><span class="graybg">基本概念</span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 20%; text-align: center;">名词</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>MPM</td>
<td>
<p>Apache2引入的特性，即多处理模块（Multi-Processing Modules）。MPM是Apache用来处理网络请求的模块，其功能包括：绑定网络端口、接受请求、分发给子例程执行请求处理</p>
<p>引入MPM，可以实现针对平台、针对业务场景的优化：</p>
<ol>
<li>对于Windows平台，默认使用mpm_winnt，从而避免了Apache 1.3中的POSIX抽象层</li>
<li>对于高可扩容性场景，可以使用基于线程的MPM，例如worker或者event</li>
<li>如果需要稳定性、对老软件的兼容性，可以使用prefork</li>
</ol>
<p>要查看当前使用的MPM，可以使用命令：</p>
<pre class="crayon-plain-tag">apachectl -V
# 输出如下
# ...
# Server MPM:     prefork
#  threaded:     no
#    forked:     yes (variable process count)
# Server compiled with....</pre>
<p>在同一时刻，只能有一个MPM被加载。</p>
<p>默认使用的MPM取决于Apache的编译配置选项<pre class="crayon-plain-tag">--with-mpm</pre> </p>
</td>
</tr>
</tbody>
</table>
<div class="blog_h1"><span class="graybg">安装</span></div>
<div class="blog_h2"><span class="graybg">Ubuntu 14.04</span></div>
<div class="blog_h3"><span class="graybg">安装必要的软件</span></div>
<pre class="crayon-plain-tag">#安装apache服务器
sudo apt-get install apache2
#可选：安装PHP模块
sudo apt-get install php5 libapache2-mod-php5 
#可选：安装phpmyadmin
apt-get install phpmyadmin</pre>
<div class="blog_h3"><span class="graybg">启用rewrite模块</span></div>
<pre class="crayon-plain-tag">#方法一
a2enmod rewrite
service apache2 restart

#方法二:找到APACHE文件中的httpd.conf文件, 把#LoadModule rewrite_module modules/mod_rewrite.so 前的#去掉，加载rewrite模块
vim /etc/apache2/apache2.conf</pre>
<div class="blog_h3"><span class="graybg">启用反向代理支持</span></div>
<pre class="crayon-plain-tag">a2enmod proxy_http proxy
service apache2 restart</pre>
<div class="blog_h3"><span class="graybg">MPM优化（prefork）</span></div>
<pre class="crayon-plain-tag">&lt;IfModule mpm_prefork_module&gt;
    StartServers        10            #初始启动的apache2进程数
    MinSpareServers     10            #最小空闲进程数
    MaxSpareServers     20            #最大空闲进程数，更多的空闲进程会被销毁
    ServerLimit         2000          #进程总数硬性限制
    MaxClients          300           #最大的客户端数，每个客户端都对应进程
    MaxRequestsPerChild 1000          #进程重启前最多服务的次数
&lt;/IfModule&gt;</pre>
<div class="blog_h2"><span class="graybg">Ubuntu安装最新版</span></div>
<p>Ubuntu 16.04等版本Apache2版本比较老旧，要使用最新的特性，可以使用第三方PPA安装：</p>
<pre class="crayon-plain-tag">sudo add-apt-repository ppa:ondrej/apache2
sudo apt update
sudo apt install apache2</pre>
<div class="blog_h2"><span class="graybg"><a id="containerization"></a>容器化</span></div>
<p>可以选择附带了Apache的PHP镜像：</p>
<pre class="crayon-plain-tag">docker pull php:5-apache</pre>
<p>扩展此镜像，根据需要更改配置：</p>
<pre class="crayon-plain-tag">FROM php:5-apache
ADD /root /root
ADD /etc /etc
RUN a2dissite 000-default.conf  &amp;&amp; a2ensite gmem.conf &amp;&amp; a2enmod ssl &amp;&amp; a2enmod proxy</pre>
<p>构建镜像：</p>
<pre class="crayon-plain-tag">FROM php:5-apache

ADD /etc /etc

RUN a2dissite 000-default.conf  &amp;&amp; a2ensite gmem.conf &amp;&amp; a2enmod ssl proxy rewrite &amp;&amp; \
    apt update &amp;&amp; apt install -y php5-mysql

ADD /root /root
ADD /usr /usr</pre>
<p>运行容器：</p>
<pre class="crayon-plain-tag">docker create --name apache2 -p 80:80 -p 443:443 
    -v /var/www/html:/var/www/html -v /etc/ssl/private:/etc/ssl/private 
    -v /usr/share/ca-certificates:/usr/share/ca-certificates 
    docker.gmem.cc/apache2
docker start apache2</pre>
<div class="blog_h3"><span class="graybg">启用MySQL支持</span></div>
<p>在本机上测试时，发现PHP扩展的位置不正确，导致MySQL扩展无法加载，解决办法是填写PHP配置文件中extension的绝对路径：</p>
<pre class="crayon-plain-tag">; configuration for php MySQL module
; priority=20
extension=/usr/lib/php5/20131226/mysqli.so</pre>
<div class="blog_h3"><span class="graybg">启用调试支持</span></div>
<p>安装XDebug：</p>
<pre class="crayon-plain-tag">apt-get install php5-xdebug
# 查找SO位置
dpkg -L php5-xdebug
# ...
# /usr/lib/php5/20131226/xdebug.so</pre>
<p>配置XDebug：</p>
<pre class="crayon-plain-tag">[xdebug]
zend_extension = /usr/lib/php5/20131226/xdebug.so</pre>
<p>然后重新启动容器。如果遇到问题，可以参考<a href="/php-under-ubuntu">Ubuntu下安装PHP</a></p>
<div class="blog_h1"><span class="graybg">常用命令</span></div>
<div class="blog_h2"><span class="graybg">htpasswd</span></div>
<p>管理用于基本认证的密码文件。</p>
<div class="blog_h3"><span class="graybg">格式</span></div>
<pre class="crayon-plain-tag">htpasswd [ -c ] [ -i ] [ -m | -B | -d | -s | -p ] [ -C cost ] [ -D ] [ -v ] passwdfile username
htpasswd -b [ -c ] [ -m | -B | -d | -s | -p ] [ -C cost ] [ -D ] [ -v ] passwdfile username password
htpasswd -n [ -i ] [ -m | -B | -d | -s | -p ] [ -C cost ] username
htpasswd -nb [ -m | -B | -d | -s | -p ] [ -C cost ] username password</pre>
<div class="blog_h3"><span class="graybg">选项</span></div>
<p>-b 批处理模式，密码从命令行参数直接读取，而非提示输入<br />-c 创建密码文件，如果已经存在则替换<br />-n 仅仅将结果打印到控制台，不更新密码文件 <br />-m 对密码进行MD5编码。密码文件中显示为$apr1$<br />-B 对密码进行bcrypt编码。密码文件中显示为 $2y$<br />-s 对密码使用SHA编码。密码文件中显示为{SHA}<br />-p 密码使用明文<br />-D 删除用户</p>
<div class="blog_h3"><span class="graybg">示例</span></div>
<pre class="crayon-plain-tag"># 将基于Bcrypt加密的密码打印到控制台
htpasswd -nbB alex pswd
# 添加一个用户到密码文件.passwd中
htpasswd -b .passwd alex 123456</pre>
<div class="blog_h1"><span class="graybg">配置</span></div>
<div class="blog_h2"><span class="graybg">重定向</span></div>
<pre class="crayon-plain-tag">Redirect / https://blog.gmem.cc </pre>
<div class="blog_h2"><span class="graybg">SSL配置</span></div>
<p>启用SSL模块</p>
<pre class="crayon-plain-tag">a2enmod ssl</pre>
<p>修改Apache配置文件：</p>
<pre class="crayon-plain-tag">#vim /etc/apache2/apache2.conf
#添加以下内容：

    DocumentRoot /var/www/html/blog
    ServerName blog.gmem.cc
    SSLEngine on
    SSLCipherSuite AES128+EECDH:AES128+EDH
    SSLCertificateFile /usr/share/ca-certificates/blog.gmem.cc.crt
    SSLCertificateKeyFile /etc/ssl/private/blog.gmem.cc.key
    SSLCertificateChainFile /usr/share/ca-certificates/AlphaSSLCA.crt


#可选的，修改下面的内容

    DocumentRoot /var/www/html/blog
    ServerName blog.gmem.cc
    Redirect permanent / https://blog.gmem.cc/  #添加这一行，强制重定向</pre>
<div class="blog_h2"><span class="graybg">反向代理</span></div>
<p>启用proxy模块： </p>
<pre class="crayon-plain-tag">a2enmod proxy</pre>
<div class="blog_h3"><span class="graybg">代理配置</span></div>
<p>转发请求给其它服务器处理：</p>
<pre class="crayon-plain-tag">SSLProxyEngine on
    ProxyPass "/" "http://l.yimg.com"</pre>
<p>在上面的例子中，假设Apache服务器的域名是gmem.cc，那么，客户端访问https://gmem.cc/index.html会被转发给http://l.yimg.com/index.html。</p>
<div class="blog_h3"><span class="graybg">重定向处理</span></div>
<p>如果正向代理的响应是302重定向时，可以将地址进行变换：</p>
<pre class="crayon-plain-tag">SSLProxyEngine on
    ProxyPass "/" "http://l.yimg.com"
    ProxyPassReverse  "/yimg" "http://l.yimg.com"</pre>
<p>假设用户访问https://gmem.cc/index.html，被转发给http://l.yimg.com/index.html，并且l.yimg.com返回302重定向到http://l.yimg.com/index.php。这种情况下，ProxyPassReverse会将其改写为http://gmem.cc/index.php。保证客户端总是访问gmem.cc而非l.yimg.com。</p>
<div class="blog_h3"><span class="graybg">缓存控制</span></div>
<p>启用缓存模块：</p>
<pre class="crayon-plain-tag">a2enmod cache_disk</pre>
<p>修改虚拟主机配置： </p>
<pre class="crayon-plain-tag">SSLProxyEngine on

    ProxyRequests On
    ProxyPreserveHost On
    ProxyPass "/" "http://repo1.maven.org/maven2"
    ProxyPassReverse "/" "http://repo1.maven.org/maven2"

    CacheEnable disk /
    CacheRoot /var/www/html/m2
    CacheIgnoreNoLastMod On
    CacheDefaultExpire 2592000

    Header unset Expires
    Header unset Cache-Control
    Header unset Pragma

 </pre>
<div class="blog_h2"><span class="graybg"><a id="proxy-protocol"></a>代理协议支持</span></div>
<p>如果Apache作为HA Proxy Protocol的后端运行，需要启用以下模块：</p>
<pre class="crayon-plain-tag">a2enmod remoteip</pre>
<p>并且在你的站点中配置：</p>
<pre class="crayon-plain-tag">&lt;VirtualHost *:80&gt;
    RemoteIPProxyProtocol On
&lt;/VirtualHost&gt;</pre>
<div class="blog_h1"><span class="graybg">常见问题</span></div>
<div class="blog_h2"><span class="graybg"><a id="a2enmod-usage"></a>如何通过a2enmod启用模块</span></div>
<p>支持该命令的模块，需要在/etc/apache2/mods-available目录中配置，例如：</p>
<pre class="crayon-plain-tag">LoadModule wsgi_module /usr/lib/apache2/modules/mod_wsgi.so</pre>
<p>然后，执行：</p>
<pre class="crayon-plain-tag">sudo a2enmod wsgi
sudo service apache2 restart</pre>
<p>类似的，你可以禁用模块：</p>
<pre class="crayon-plain-tag">a2dismod wsgi</pre>
<div class="blog_h2"><span class="graybg">通往HTTPS的反向代理</span></div>
<p>Apache错误日志：SSL Proxy requested for blog.gmem.cc:443 but not enabled [Hint: SSLProxyEngine]</p>
<p>解决办法，添加指令：<pre class="crayon-plain-tag">SSLProxyEngine on</pre></p>
<div class="blog_h2"><span class="graybg">如何配置SSL证书</span></div>
<div class="blog_h3"><span class="graybg">证书申请</span></div>
<pre class="crayon-plain-tag">cd ~
mkdir gmem.cc
cd gmem.cc
#创建密钥对
openssl genrsa -out blog.gmem.cc.key 2048
cp blog.gmem.cc.key /etc/ssl/private
#生成证书请求
openssl req -new -sha256 -key blog.gmem.cc.key -out blog.gmem.cc.csr

#申请并得到证书…

#输入证书内容并保存，例如：
vim /usr/share/ca-certificates/blog.gmem.cc.crt
#-----BEGIN CERTIFICATE-----
#MIIEwjCCA6qgAwIBAgISESGIh1S66rfir4xGsZxxAqTqMA0GCSqGSIb3DQEBCwUA
#MEwxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMSIwIAYD
#VQQDExlBbHBoYVNTTCBDQSAtIFNIQTI1NiAtIEcyMB4XDTE1MDkyMTAzMjcwMloX
#DTE2MDkyMTAzMjcwMlowOjEhMB8GA1UECxMYRG9tYWluIENvbnRyb2wgVmFsaWRh
#dGVkMRUwEwYDVQQDEwxibG9nLmdtZW0uY2MwggEiMA0GCSqGSIb3DQEBAQUAA4IB
#DwAwggEKAoIBAQCrOzCBJqH0njgeu8hDDugeeIvT5e0Iy3J3s8IcAOQ9uRXqDCdL
#9mB9Z1gR6wyvG9yufTL0WK13Q95Q96BxhNR3EYLj5Qx7C1Xec+EoQDAOnddWhRac
#3WDhop3tZFAkM4i01ootLQ6MJXHopJ3qqDxRF4fd26nPW/GIZSUlVX/ehR5VwCDm
#/RBTK8TQqY9FYHnkjxp8DYhIDonckM+3CcAcUIPw8lp2aUldxvbvppFzrR17lg9C
#NCPrZ4UNvAzI8Zgpq0KrRlw90rMhzRz7ZMrqiTUrtmGGilpY7bNw6oE8wESoVUfV
#5WxwqNecYbQPGJymPg/pFvS9sH8VHAY8/2LxAgMBAAGjggGuMIIBqjAOBgNVHQ8B
#Af8EBAMCBaAwSQYDVR0gBEIwQDA+BgZngQwBAgEwNDAyBggrBgEFBQcCARYmaHR0
#cHM6Ly93d3cuZ2xvYmFsc2lnbi5jb20vcmVwb3NpdG9yeS8wFwYDVR0RBBAwDoIM
#YmxvZy5nbWVtLmNjMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsG
#AQUFBwMCMD4GA1UdHwQ3MDUwM6AxoC+GLWh0dHA6Ly9jcmwyLmFscGhhc3NsLmNv
#bS9ncy9nc2FscGhhc2hhMmcyLmNybDCBiQYIKwYBBQUHAQEEfTB7MEIGCCsGAQUF
#BzAChjZodHRwOi8vc2VjdXJlMi5hbHBoYXNzbC5jb20vY2FjZXJ0L2dzYWxwaGFz
#aGEyZzJyMS5jcnQwNQYIKwYBBQUHMAGGKWh0dHA6Ly9vY3NwMi5nbG9iYWxzaWdu
#LmNvbS9nc2FscGhhc2hhMmcyMB0GA1UdDgQWBBSh9VXXKm6v6J9mMBPtuSoqHeBd
#0zAfBgNVHSMEGDAWgBT1zdU8CFD5ak86t5faVoPmadJo9zANBgkqhkiG9w0BAQsF
#AAOCAQEA2GG9Lj1FWHjxJv59Bw/WpQDH5arlKEbyAeC+gDaqWbAJXWY1F4eEv57f
#aKrofViZ2+hNDqioDrsjFMUNlqPZ1Shh853h5PKsSGSEKqySxgOGCd9jQba4WL8h
#4HRaVVLUQfoJR09EXmKuZRZxx5iCu0V1dptTbVkBO24VGUBT9h8qQ5NKfXCUTVGd
#7ZXbbh/fR4gp9xik9XkIDn47BrRFgvbjawRFucUCHPqdz1G2B/wGqv0DqHJLziw3
#wiO3/9lfNgmgexpnpTF9LxIpOU6OhLwwgE/C43pU9/A1b+M0jmxzbqvi6hgoOV4H
#GPyhTFNeCKD/njpeHcSHHCo3tFuvfw==
#-----END CERTIFICATE-----

#保存中介证书AlphaSSL Intermediate CA
vim /usr/share/ca-certificates/AlphaSSLCA.crt
#-----BEGIN CERTIFICATE-----
#MIIETTCCAzWgAwIBAgILBAAAAAABRE7wNjEwDQYJKoZIhvcNAQELBQAwVzELMAkG
#A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
#b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw0xNDAyMjAxMDAw
#MDBaFw0yNDAyMjAxMDAwMDBaMEwxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
#YWxTaWduIG52LXNhMSIwIAYDVQQDExlBbHBoYVNTTCBDQSAtIFNIQTI1NiAtIEcy
#MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2gHs5OxzYPt+j2q3xhfj
#kmQy1KwA2aIPue3ua4qGypJn2XTXXUcCPI9A1p5tFM3D2ik5pw8FCmiiZhoexLKL
#dljlq10dj0CzOYvvHoN9ItDjqQAu7FPPYhmFRChMwCfLew7sEGQAEKQFzKByvkFs
#MVtI5LHsuSPrVU3QfWJKpbSlpFmFxSWRpv6mCZ8GEG2PgQxkQF5zAJrgLmWYVBAA
#cJjI4e00X9icxw3A1iNZRfz+VXqG7pRgIvGu0eZVRvaZxRsIdF+ssGSEj4k4HKGn
#kCFPAm694GFn1PhChw8K98kEbSqpL+9Cpd/do1PbmB6B+Zpye1reTz5/olig4het
#ZwIDAQABo4IBIzCCAR8wDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8C
#AQAwHQYDVR0OBBYEFPXN1TwIUPlqTzq3l9pWg+Zp0mj3MEUGA1UdIAQ+MDwwOgYE
#VR0gADAyMDAGCCsGAQUFBwIBFiRodHRwczovL3d3dy5hbHBoYXNzbC5jb20vcmVw
#b3NpdG9yeS8wMwYDVR0fBCwwKjAooCagJIYiaHR0cDovL2NybC5nbG9iYWxzaWdu
#Lm5ldC9yb290LmNybDA9BggrBgEFBQcBAQQxMC8wLQYIKwYBBQUHMAGGIWh0dHA6
#Ly9vY3NwLmdsb2JhbHNpZ24uY29tL3Jvb3RyMTAfBgNVHSMEGDAWgBRge2YaRQ2X
#yolQL30EzTSo//z9SzANBgkqhkiG9w0BAQsFAAOCAQEAYEBoFkfnFo3bXKFWKsv0
#XJuwHqJL9csCP/gLofKnQtS3TOvjZoDzJUN4LhsXVgdSGMvRqOzm+3M+pGKMgLTS
#xRJzo9P6Aji+Yz2EuJnB8br3n8NA0VgYU8Fi3a8YQn80TsVD1XGwMADH45CuP1eG
#l87qDBKOInDjZqdUfy4oy9RU0LMeYmcI+Sfhy+NmuCQbiWqJRGXy2UzSWByMTsCV
#odTvZy84IOgu/5ZR8LrYPZJwR2UcnnNytGAMXOLRc3bgr07i5TelRS+KIz6HxzDm
#MTh89N1SyvNTBCVXVmaU6Avu5gMUTu79bZRknl7OedSyps9AsUSoPocZXun4IRZZUw==
#-----END CERTIFICATE----- </pre>
</div><p>The post <a rel="nofollow" href="https://blog.gmem.cc/apache-http-server-faq">Apache HTTP Server知识集锦</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.gmem.cc/apache-http-server-faq/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>CXF带SSL支持的客户端示例</title>
		<link>https://blog.gmem.cc/cxf-client-with-ssl</link>
		<comments>https://blog.gmem.cc/cxf-client-with-ssl#comments</comments>
		<pubDate>Sun, 23 Dec 2012 03:14:09 +0000</pubDate>
		<dc:creator><![CDATA[Alex]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[CXF]]></category>
		<category><![CDATA[SSL]]></category>
		<category><![CDATA[WebService]]></category>

		<guid isPermaLink="false">http://blog.gmem.cc/?p=1495</guid>
		<description><![CDATA[<p>WebService接口定义 基于JAX-WS定义的接口： [crayon-69e09a4b1d05c424473154/] SSL客户端示例 [crayon-69e09a4b1d061844695318/]</p>
<p>The post <a rel="nofollow" href="https://blog.gmem.cc/cxf-client-with-ssl">CXF带SSL支持的客户端示例</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="wri_content_clear_both"><div class="blog_h3"><span class="graybg">WebService接口定义</span></div>
<p>基于JAX-WS定义的接口：</p>
<pre class="crayon-plain-tag">@WebService
public interface DataTransService
{

    @WebMethod ( operationName = "sendXML" )
    @WebResult ( name = "response" )
    String sendXML(
            @WebParam ( name = "userName" ) String userName,
            @WebParam ( name = "password" ) String password,
            @WebParam ( name = "msg" ) String msg );

}</pre>
<div class="blog_h3"><span class="graybg">SSL客户端示例</span></div>
<pre class="crayon-plain-tag">public void send(String username,String password,String xml) {
    String address = "https://127.0.0.1:5051/dataTransService";
    JaxWsProxyFactoryBean proxyFactory = new JaxWsProxyFactoryBean();
    proxyFactory.setServiceClass( DataTransService.class );
    proxyFactory.setAddress( address );
    DataTransService service = (DataTransService) proxyFactory.create();
    org.apache.cxf.endpoint.Client client = ClientProxy.getClient( service );


    HTTPConduit httpConduit = (HTTPConduit) client.getConduit();
    TLSClientParameters tlsParams = initTLSClientParameters();

    httpConduit.setTlsClientParameters( tlsParams );

    service.sendXML( username, password,xml);
}

private TLSClientParameters initTLSClientParameters() throws
    KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException, FileNotFoundException, UnrecoverableKeyException
{
    TLSClientParameters tlsParams = new TLSClientParameters();
    tlsParams.setDisableCNCheck( true );
    CanaryConfig cfg = getCanaryConfig();
    {
        KeyStore trustKeyStore = KeyStore.getInstance( cfg.getString( "https.trustManagers.keyStore.type" ) );
        String trustKeyStorePassword = cfg.getString( "https.trustManagers.keyStore.password" );
        String url = cfg.getString( "https.trustManagers.keyStore.url" );
        File trustKeyStoreFile = CanaryHelper.urlToFile( url );
        trustKeyStore.load( new FileInputStream( trustKeyStoreFile ), trustKeyStorePassword.toCharArray() );
        TrustManagerFactory trustFactory = TrustManagerFactory.getInstance( TrustManagerFactory.getDefaultAlgorithm() );
        trustFactory.init( trustKeyStore );
        TrustManager[] tm = trustFactory.getTrustManagers();
        tlsParams.setTrustManagers( tm );
    }
    {
        KeyStore priKeyStore = KeyStore.getInstance( cfg.getString( "https.keyManagers.keyStore.type" ) );
        String priKeyStorePassword = cfg.getString( "https.keyManagers.keyStore.password" );
        String url = cfg.getString( "https.keyManagers.keyStore.url" );
        File priKeyStoreFile = CanaryHelper.urlToFile( url );
        priKeyStore.load( new FileInputStream( priKeyStoreFile ), priKeyStorePassword.toCharArray() );
        KeyManagerFactory keyFactory = KeyManagerFactory.getInstance( KeyManagerFactory.getDefaultAlgorithm() );
        keyFactory.init( priKeyStore, cfg.getString( "https.keyManagers.keyPassword" ).toCharArray() );
        KeyManager[] km = keyFactory.getKeyManagers();
        tlsParams.setKeyManagers( km );
    }
    {
        FiltersType filter = new FiltersType();
        filter.getInclude().add( ".*_EXPORT_.*" );
        filter.getInclude().add( ".*_EXPORT1024_.*" );
        filter.getInclude().add( ".*_WITH_DES_.*" );
        filter.getInclude().add( ".*_WITH_NULL_.*" );
        filter.getExclude().add( ".*_DH_anon_.*" );
        tlsParams.setCipherSuitesFilter( filter );
    }
    return tlsParams;
}</pre>
</div><p>The post <a rel="nofollow" href="https://blog.gmem.cc/cxf-client-with-ssl">CXF带SSL支持的客户端示例</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.gmem.cc/cxf-client-with-ssl/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Spring配置：启用Jetty SSL传输的CXF</title>
		<link>https://blog.gmem.cc/spring-confg-cxf-with-ssl</link>
		<comments>https://blog.gmem.cc/spring-confg-cxf-with-ssl#comments</comments>
		<pubDate>Sat, 22 Dec 2012 10:34:51 +0000</pubDate>
		<dc:creator><![CDATA[Alex]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[CXF]]></category>
		<category><![CDATA[Jetty]]></category>
		<category><![CDATA[JKS]]></category>
		<category><![CDATA[SSL]]></category>
		<category><![CDATA[WebService]]></category>

		<guid isPermaLink="false">http://blog.gmem.cc/?p=1144</guid>
		<description><![CDATA[<p>Spring配置文件 [crayon-69e09a4b1d3d2616987232/] 使用JDK的keytool密钥对 使用JDK自带的keytool命令可以生成JKS（Java KeyStore）文件，作为数字证书库使用。在配置SSL时，一般需要用到两个JKS：信任库、证书库（对应上节配置文件中的truststore、keystore）。 下面是生成证书库的示例： [crayon-69e09a4b1d3db997997712/]</p>
<p>The post <a rel="nofollow" href="https://blog.gmem.cc/spring-confg-cxf-with-ssl">Spring配置：启用Jetty SSL传输的CXF</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="wri_content_clear_both"><div class="blog_h3"><span class="graybg">Spring配置文件</span></div>
<pre class="crayon-plain-tag">&lt;beans 
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:sec="http://cxf.apache.org/configuration/security"
    xmlns:http="http://cxf.apache.org/transports/http/configuration"
    xmlns:httpj="http://cxf.apache.org/transports/http-jetty/configuration"
    xmlns:cxf="http://cxf.apache.org/core"
    xmlns:jaxws="http://cxf.apache.org/jaxws"

    xsi:schemaLocation="
        http://cxf.apache.org/configuration/security http://cxf.apache.org/schemas/configuration/security.xsd
        http://cxf.apache.org/transports/http/configuration http://cxf.apache.org/schemas/configuration/http-conf.xsd
        http://cxf.apache.org/transports/http-jetty/configuration http://cxf.apache.org/schemas/configuration/http-jetty.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd
        http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd "&gt;

    &lt;import resource="classpath:META-INF/cxf/cxf.xml" /&gt;
    &lt;import resource="classpath:META-INF/cxf/cxf-extension-jaxws.xml" /&gt;

    &lt;cxf:bus&gt;
        &lt;cxf:features&gt;
            &lt;cxf:logging /&gt;
        &lt;/cxf:features&gt;
    &lt;/cxf:bus&gt;
    &lt;bean id="cfg" class="sparknet.canary.core.cfg" init-method="init"&gt;
        &lt;property name="params"&gt;
            &lt;value&gt;
            &lt;![CDATA[
                http.port=5050
                https.port=5051
                https.keyManagers.keyStore.type=JKS
                https.keyManagers.keyPassword=sparknet
                https.keyManagers.keyStore.password=sparknet
                https.keyManagers.keyStore.url=#{@cfg.baseDirUrl}/work/security/key/platform.jks
                https.trustManagers.keyStore.type=JKS
                https.trustManagers.keyStore.password=sparknet
                https.trustManagers.keyStore.url=#{@cfg.baseDirUrl}/work/security/cert/trust.jks
                http.minThreads=5
                http.maxThreads=50
            ]]&gt;
            &lt;/value&gt;
        &lt;/property&gt;
    &lt;/bean&gt;
    &lt;bean name="dataTransServiceImplHttp" class="cc.gmem.demo.ws.DataTransServiceImpl" autowire="byName"&gt;
        &lt;property name="https" value="false" /&gt;
    &lt;/bean&gt;
    &lt;bean name="dataTransServiceImplHttps" class="cc.gmem.demo.ws.DataTransServiceImpl" autowire="byName"&gt;
        &lt;property name="https" value="true" /&gt;
    &lt;/bean&gt;
    &lt;jaxws:endpoint id="dataTransServiceHttp" implementor="#dataTransServiceImplHttp" address="http://0.0.0.0:#{@cfg.params['http.port']}/dataTransService" publish="true" /&gt;
    &lt;jaxws:endpoint id="dataTransServiceHttps" implementor="#dataTransServiceImplHttps" address="https://0.0.0.0:#{@cfg.params['https.port']}/dataTransService" publish="true" /&gt;

    &lt;httpj:engine-factory bus="cxf"&gt;

        &lt;httpj:identifiedThreadingParameters id="threadPool"&gt;
            &lt;httpj:threadingParameters minThreads="#{@cfg.params['http.minThreads']}" maxThreads="#{@cfg.params['http.maxThreads']}" /&gt;
        &lt;/httpj:identifiedThreadingParameters&gt;

        &lt;httpj:engine port="#{@cfg.params['http.port']}"&gt;
            &lt;httpj:threadingParametersRef id="threadPool" /&gt;
            &lt;httpj:connector&gt;
                &lt;bean class="org.eclipse.jetty.server.bio.SocketConnector"&gt;
                    &lt;property name="port" value="#{@cfg.params['http.port']}" /&gt;
                &lt;/bean&gt;
            &lt;/httpj:connector&gt;
        &lt;/httpj:engine&gt;
        &lt;httpj:engine port="#{@cfg.params['https.port']}"&gt;
            &lt;httpj:tlsServerParameters&gt;
                &lt;sec:keyManagers keyPassword="#{@cfg.params['https.keyManagers.keyPassword']}"&gt;
                    &lt;sec:keyStore type="#{@cfg.params['https.keyManagers.keyStore.type']}" url="#{@cfg.params['https.keyManagers.keyStore.url']}" password="#{@cfg.params['https.keyManagers.keyStore.password']}" /&gt;
                &lt;/sec:keyManagers&gt;
                &lt;sec:trustManagers&gt;
                    &lt;sec:keyStore type="#{@cfg.params['https.trustManagers.keyStore.type']}" url="#{@cfg.params['https.trustManagers.keyStore.url']}" password="#{@cfg.params['https.trustManagers.keyStore.password']}" /&gt;
                &lt;/sec:trustManagers&gt;
                &lt;sec:cipherSuitesFilter&gt;
                    &lt;sec:include&gt;.*_EXPORT_.*&lt;/sec:include&gt;
                    &lt;sec:include&gt;.*_EXPORT1024_.*&lt;/sec:include&gt;
                    &lt;sec:include&gt;.*_WITH_DES_.*&lt;/sec:include&gt;
                    &lt;sec:include&gt;.*_WITH_AES_.*&lt;/sec:include&gt;
                    &lt;sec:include&gt;.*_WITH_NULL_.*&lt;/sec:include&gt;
                    &lt;sec:exclude&gt;.*_DH_anon_.*&lt;/sec:exclude&gt;
                &lt;/sec:cipherSuitesFilter&gt;
                &lt;sec:clientAuthentication want="true" required="true" /&gt;
            &lt;/httpj:tlsServerParameters&gt;
            &lt;httpj:threadingParametersRef id="threadPool" /&gt;
            &lt;httpj:connector&gt;
                &lt;bean class="org.eclipse.jetty.server.ssl.SslSocketConnector"&gt;
                    &lt;property name="port" value="#{@cfg.params['https.port']}" /&gt;
                    &lt;property name="password" value="#{@cfg.params['https.keyManagers.keyStore.password']}" /&gt;
                    &lt;property name="trustPassword" value="#{@cfg.params['https.trustManagers.keyStore.password']}" /&gt;
                    &lt;property name="keyPassword" value="#{@cfg.params['https.keyManagers.keyPassword']}" /&gt;
                    &lt;property name="protocol" value="TLS" /&gt;
                    &lt;property name="keystore" value="#{@cfg.params['https.keyManagers.keyStore.url']}" /&gt;
                    &lt;property name="keystoreType" value="#{@cfg.params['https.keyManagers.keyStore.type']}" /&gt;
                    &lt;property name="truststore" value="#{@cfg.params['https.trustManagers.keyStore.url']}" /&gt;
                    &lt;property name="truststoreType" value="#{@cfg.params['https.trustManagers.keyStore.type']}" /&gt;
                    &lt;property name="wantClientAuth" value="false" /&gt;
                    &lt;property name="needClientAuth" value="false" /&gt;
                &lt;/bean&gt;
            &lt;/httpj:connector&gt;
        &lt;/httpj:engine&gt;
    &lt;/httpj:engine-factory&gt;
&lt;/beans&gt;</pre>
<div class="blog_h3"><span class="graybg">使用JDK的keytool密钥对</span></div>
<p>使用JDK自带的keytool命令可以生成JKS（Java KeyStore）文件，作为数字证书库使用。在配置SSL时，一般需要用到两个JKS：信任库、证书库（对应上节配置文件中的truststore、keystore）。<br /> 下面是生成证书库的示例：</p>
<pre class="crayon-plain-tag">keytool -genkey -alias platform -keyalg RSA -keypass key_password -storepass store_password -dname "CN=DataTrans Platform, OU=, O=Gmem.cc, L=Nan Jing, ST=Jiang Su, C=CN" -validity 3650 -keystore platform.jks</pre>
</div><p>The post <a rel="nofollow" href="https://blog.gmem.cc/spring-confg-cxf-with-ssl">Spring配置：启用Jetty SSL传输的CXF</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.gmem.cc/spring-confg-cxf-with-ssl/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
