<?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>ls /proc &#187; nginx</title>
	<atom:link href="http://www.lsproc.com/blog/tag/nginx/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.lsproc.com/blog</link>
	<description>lsproc.com</description>
	<lastBuildDate>Fri, 18 Nov 2011 09:22:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Nginx/PHP 文件类型错误解析漏洞：fix_pathinfo</title>
		<link>http://www.lsproc.com/blog/nginx_php_pathinfo_securit/</link>
		<comments>http://www.lsproc.com/blog/nginx_php_pathinfo_securit/#comments</comments>
		<pubDate>Fri, 21 May 2010 03:34:47 +0000</pubDate>
		<dc:creator>lostsnow</dc:creator>
				<category><![CDATA[Program&Database]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[pathinfo]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://www.lsproc.com/blog/?p=410</guid>
		<description><![CDATA[转载时请标明文章原始出处和作者信息, 作者: lostsnow.http://www.lsproc.com/blog/nginx_php_pathinfo_securit/ 漏洞介绍：nginx是一款高性能的web服务器，使用非常广泛，其不仅经常被用作反向代理，也可以非常好的支持PHP的运行。80sec发现其中存在一个较为严重的安全问题，默认情况下可能导致服务器错误的将任何类型的文件以PHP的方式进行解析，这将导致严重的安全问题，使得恶意的攻击者可能攻陷支持php的nginx服务器。 漏洞分析：nginx默认以cgi的方式支持php的运行，譬如在配置文件当中可以以 location ~ \.php$ { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; include fastcgi_params; } 的方式支持对php的解析，location对请求进行选择的时候会使用URI环境变量进行选择，其中传递到后端Fastcgi的关键变量 SCRIPT_FILENAME由nginx生成的$fastcgi_script_name决定，而通过分析可以看到$fastcgi_script_name是直接由URI环境变量控制的，这里就是产生问题的点。而为了较好的支持PATH_INFO的提取，在PHP 的配置选项里存在cgi.fix_pathinfo选项，其目的是为了从SCRIPT_FILENAME里取出真正的脚本名。 那么假设存在一个http://www.lsproc.com/a.jpg，我们以如下的方式去访问 http://www.lsproc.com/a.jpg/xxx.php 将会得到一个URI /a.jpg/xxx.php 经过location指令，该请求将会交给后端的fastcgi处理，nginx为其设置环境变量SCRIPT_FILENAME，内容为 /scripts/a.jpg/xxx.php 而在其他的webserver如lighttpd当中，我们发现其中的SCRIPT_FILENAME被正确的设置为 /scripts/a.jpg 所以不存在此问题。 后端的fastcgi在接受到该选项时，会根据fix_pathinfo配置决定是否对SCRIPT_FILENAME进行额外的处理，一般情况下如果不对fix_pathinfo进行设置将影响使用PATH_INFO进行路由选择的应用，所以该选项一般配置开启。Php通过该选项之后将查找其中真正的脚本文件名字，查找的方式也是查看文件是否存在，这个时候将分离出SCRIPT_FILENAME和PATH_INFO分别为 /scripts/a.jpg和xxx.php 最后，以/scripts/a.jpg作为此次请求需要执行的脚本，攻击者就可以实现让nginx以php来解析任何类型的文件了。 PHP为什么会接受这样的参数, 并且把a.jpg解析呢? 这就要说到PHP的cgi SAPI中的参数, &#8230; <a href="http://www.lsproc.com/blog/nginx_php_pathinfo_securit/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>转载时请标明文章原始出处和作者信息, 作者: <a href="http://www.lsproc.com/blog/">lostsnow</a>.<br /><a href="http://www.lsproc.com/blog/nginx_php_pathinfo_securit/">http://www.lsproc.com/blog/nginx_php_pathinfo_securit/</a></p>
<p>漏洞介绍：nginx是一款高性能的web服务器，使用非常广泛，其不仅经常被用作反向代理，也可以非常好的支持PHP的运行。80sec发现其中存在一个较为严重的安全问题，默认情况下可能导致服务器错误的将任何类型的文件以PHP的方式进行解析，这将导致严重的安全问题，使得恶意的攻击者可能攻陷支持php的nginx服务器。</p>
<p>漏洞分析：nginx默认以cgi的方式支持php的运行，譬如在配置文件当中可以以</p>
<pre class="brush: text">
location ~ \.php$ {
    root html;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
    include fastcgi_params;
}
</pre>
<p>的方式支持对php的解析，location对请求进行选择的时候会使用URI环境变量进行选择，其中传递到后端Fastcgi的关键变量 SCRIPT_FILENAME由nginx生成的$fastcgi_script_name决定，而通过分析可以看到$fastcgi_script_name是直接由URI环境变量控制的，这里就是产生问题的点。而为了较好的支持PATH_INFO的提取，在PHP 的配置选项里存在cgi.fix_pathinfo选项，其目的是为了从SCRIPT_FILENAME里取出真正的脚本名。<br />
那么假设存在一个http://www.lsproc.com/a.jpg，我们以如下的方式去访问</p>
<pre class="brush: text">

http://www.lsproc.com/a.jpg/xxx.php
</pre>
<p>将会得到一个URI</p>
<pre class="brush: text">
/a.jpg/xxx.php
</pre>
<p>经过location指令，该请求将会交给后端的fastcgi处理，nginx为其设置环境变量SCRIPT_FILENAME，内容为</p>
<pre class="brush: text">
/scripts/a.jpg/xxx.php
</pre>
<p>而在其他的webserver如lighttpd当中，我们发现其中的SCRIPT_FILENAME被正确的设置为</p>
<pre class="brush: text">
/scripts/a.jpg
</pre>
<p>所以不存在此问题。<br />
后端的fastcgi在接受到该选项时，会根据fix_pathinfo配置决定是否对SCRIPT_FILENAME进行额外的处理，一般情况下如果不对fix_pathinfo进行设置将影响使用PATH_INFO进行路由选择的应用，所以该选项一般配置开启。Php通过该选项之后将查找其中真正的脚本文件名字，查找的方式也是查看文件是否存在，这个时候将分离出SCRIPT_FILENAME和PATH_INFO分别为</p>
<pre class="brush: text">
/scripts/a.jpg和xxx.php
</pre>
<p>最后，以/scripts/a.jpg作为此次请求需要执行的脚本，攻击者就可以实现让nginx以php来解析任何类型的文件了。</p>
<p>PHP为什么会接受这样的参数, 并且把a.jpg解析呢?<br />
这就要说到PHP的cgi SAPI中的参数, fix_pathinfo了:</p>
<pre class="brush: text">
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP&#039;s
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting
; this to 1 will cause PHP CGI to fix it&#039;s paths to conform to the spec. A setting
; of zero causes PHP to behave as before. Default is 1. You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
cgi.fix_pathinfo=1
</pre>
<p>如果开启了这个选项, 那么就会触发在PHP中的如下逻辑:</p>
<pre class="brush: php">
/*
 * if the file doesn&#039;t exist, try to extract PATH_INFO out
 * of it by stat&#039;ing back through the &#039;/&#039;
 * this fixes url&#039;s like /info.php/test
 */
if (script_path_translated &amp;&amp;
     (script_path_translated_len = strlen(script_path_translated)) &gt; 0 &amp;&amp;
     (script_path_translated[script_path_translated_len-1] == &#039;/&#039; ||
//....以下省略.
</pre>
<p>到这里, PHP会认为SCRIPT_FILENAME是a.jpg, 而xxx.php是PATH_INFO, 然后PHP就把a.jpg当作一个PHP文件来解释执行… So…</p>
<p>POC： 访问一个nginx来支持php的站点，在一个任何资源的文件如robots.txt后面加上/xxx.php，这个时候你可以看到如下的区别：</p>
<p>访问http://www.lsproc.com/robots.txt</p>
<pre class="brush: text">
HTTP/1.1 200 OK
Server: nginx/0.6.32
Date: Thu, 20 May 2010 10:05:30 GMT
Content-Type: text/plain
Content-Length: 18
Last-Modified: Thu, 20 May 2010 06:26:34 GMT
Connection: keep-alive
Keep-Alive: timeout=20
Accept-Ranges: bytes
</pre>
<p>访问http://www.lsproc.com/robots.txt/xxx.php</p>
<pre class="brush: text">
HTTP/1.1 200 OK
Server: nginx/0.6.32
Date: Thu, 20 May 2010 10:06:49 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=20
X-Powered-By: PHP/5.2.6
</pre>
<p>其中的Content-Type的变化说明了后端负责解析的变化，该站点就可能存在漏洞。</p>
<p>漏洞厂商：http://www.nginx.org</p>
<p>解决方案：</p>
<p>1. 修改php.ini中的cgi.fix_pathinfo为0 (即使你在php.ini中没有找到，也要设置，默认为1)<br />
2. 把nginx的判断正则修改为去除/</p>
<pre class="brush: text">
if ( $fastcgi_script_name ~ \..*\/.*php ) {
    return 403;
}
</pre>
<p>3. 如果上传的文件类型为图片, 使用 gd/imagemagick 等进行处理后再保存, 原始文件务必删除<br />
4. 上传的文件放到一个静态文件server, 此 server 不允许php 文件执行</p>
<p>本文参考链接</p>
<ul>
<li><a href="http://www.80sec.com/nginx-securit.html">http://www.80sec.com/nginx-securit.html</a></li>
<li><a href="http://www.laruence.com/2010/05/20/1495.html">http://www.laruence.com/2010/05/20/1495.html</a></li>
<li><a href="http://www.54chen.com/php-tech/nginx-php-cgi-of-security-hole.html">http://www.54chen.com/php-tech/nginx-php-cgi-of-security-hole.html</a></li>
</ul>
<p>-- EOF --</p>
<h2  class="related_post_title">Related Posts</h2><ul class="related_post"><li>2010-04-12 -- <a href="http://www.lsproc.com/blog/nginx_userid_decode/" title="nginx userid 模块客户端 cookie 解码">nginx userid 模块客户端 cookie 解码</a> (0)</li><li>2010-03-08 -- <a href="http://www.lsproc.com/blog/use_ob_flush_on_nginx_fastcgi/" title="nginx+factcgi 下使用 ob_flush">nginx+factcgi 下使用 ob_flush</a> (0)</li><li>2009-03-29 -- <a href="http://www.lsproc.com/blog/nginx_ssl_config/" title="Nginx SSL 配置">Nginx SSL 配置</a> (23)</li><li>2008-10-23 -- <a href="http://www.lsproc.com/blog/nginx_rewrite_param/" title="nginx rewrite 的一些参数  ">nginx rewrite 的一些参数  </a> (1)</li><li>2008-06-15 -- <a href="http://www.lsproc.com/blog/lighttpd_phpfastcgi_config/" title="lighttpd + PHP(fastcgi) 配置">lighttpd + PHP(fastcgi) 配置</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.lsproc.com/blog/nginx_php_pathinfo_securit/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>nginx userid 模块客户端 cookie 解码</title>
		<link>http://www.lsproc.com/blog/nginx_userid_decode/</link>
		<comments>http://www.lsproc.com/blog/nginx_userid_decode/#comments</comments>
		<pubDate>Mon, 12 Apr 2010 01:59:32 +0000</pubDate>
		<dc:creator>lostsnow</dc:creator>
				<category><![CDATA[Program&Database]]></category>
		<category><![CDATA[base64]]></category>
		<category><![CDATA[decode]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.lsproc.com/blog/?p=387</guid>
		<description><![CDATA[转载时请标明文章原始出处和作者信息, 作者: lostsnow.http://www.lsproc.com/blog/nginx_userid_decode/ 在网上看到用 ruby 解码的一段程序 http://forum.nginx.org/read.php?2,52592,52592 &#62; cookie_uid = &#34;0Cvz4ktwVPEdbRcMAwMFAg==&#34;; cc = cookie_uid.unpack(&#039;m*&#039;).first; rr = cc.split(&#34;&#34;).map{&#124;c&#124; c[0].to_i}.inject([]) {&#124;v,s&#124; v.push sprintf(&#34;%02X&#34;, s); v; }.values_at(3, 2, 1, 0, 7, 6, 5, 4, 11, 10, 9, 8, 15, 14, 13, 12).join(&#34;&#34;) =&#62; &#8230; <a href="http://www.lsproc.com/blog/nginx_userid_decode/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>转载时请标明文章原始出处和作者信息, 作者: <a href="http://www.lsproc.com/blog/">lostsnow</a>.<br /><a href="http://www.lsproc.com/blog/nginx_userid_decode/">http://www.lsproc.com/blog/nginx_userid_decode/</a></p>
<p>在网上看到用 ruby 解码的一段程序<br />
<a href="http://forum.nginx.org/read.php?2,52592,52592">http://forum.nginx.org/read.php?2,52592,52592</a></p>
<pre class="brush: ruby">
&gt; cookie_uid = &quot;0Cvz4ktwVPEdbRcMAwMFAg==&quot;; cc = cookie_uid.unpack(&#039;m*&#039;).first; rr = cc.split(&quot;&quot;).map{|c| c[0].to_i}.inject([]) {|v,s| v.push sprintf(&quot;%02X&quot;, s); v; }.values_at(3, 2, 1, 0, 7, 6, 5, 4, 11, 10, 9, 8, 15, 14, 13, 12).join(&quot;&quot;)
=&gt; &quot;E2F32BD0F154704B0C176D1D02050303&quot;
</pre>
<p>我用 PHP 写了一个</p>
<pre class="brush: php">
&lt;?php
function nginx_userid_decode($str)
{
    $str_unpacked =  unpack(&#039;h*&#039;, base64_decode(str_replace(&#039; &#039;, &#039;+&#039;, $str)));
    $str_split = str_split(current($str_unpacked), 8);
    $str_map = array_map(&#039;strrev&#039;, $str_split);
    $str_dedoded = strtoupper(implode(&#039;&#039;, $str_map));

    return $str_dedoded;
}

// uid=8380A8C09A7E8C4B0A112CC202030303
echo nginx_userid_decode(&#039;wKiAg0uMfprCLBEKAwMDAg==&#039;);
</pre>
<p>update:</p>
<blockquote><p>
<strong>如果 base64 后的编码中含有 '+' , 在 url 传递中或是 $_COOKIE 数组读取中会被转换为空格</strong>
</p></blockquote>
<p>-- EOF --</p>
<h2  class="related_post_title">Related Posts</h2><ul class="related_post"><li>2010-05-21 -- <a href="http://www.lsproc.com/blog/nginx_php_pathinfo_securit/" title="Nginx/PHP 文件类型错误解析漏洞：fix_pathinfo">Nginx/PHP 文件类型错误解析漏洞：fix_pathinfo</a> (2)</li><li>2010-03-08 -- <a href="http://www.lsproc.com/blog/use_ob_flush_on_nginx_fastcgi/" title="nginx+factcgi 下使用 ob_flush">nginx+factcgi 下使用 ob_flush</a> (0)</li><li>2009-03-29 -- <a href="http://www.lsproc.com/blog/nginx_ssl_config/" title="Nginx SSL 配置">Nginx SSL 配置</a> (23)</li><li>2008-10-23 -- <a href="http://www.lsproc.com/blog/nginx_rewrite_param/" title="nginx rewrite 的一些参数  ">nginx rewrite 的一些参数  </a> (1)</li><li>2008-06-15 -- <a href="http://www.lsproc.com/blog/lighttpd_phpfastcgi_config/" title="lighttpd + PHP(fastcgi) 配置">lighttpd + PHP(fastcgi) 配置</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.lsproc.com/blog/nginx_userid_decode/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>nginx+factcgi 下使用 ob_flush</title>
		<link>http://www.lsproc.com/blog/use_ob_flush_on_nginx_fastcgi/</link>
		<comments>http://www.lsproc.com/blog/use_ob_flush_on_nginx_fastcgi/#comments</comments>
		<pubDate>Mon, 08 Mar 2010 03:45:23 +0000</pubDate>
		<dc:creator>lostsnow</dc:creator>
				<category><![CDATA[Linux&Webserver]]></category>
		<category><![CDATA[buffer]]></category>
		<category><![CDATA[fastcgi]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[ob_flush]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.lsproc.com/blog/?p=376</guid>
		<description><![CDATA[转载时请标明文章原始出处和作者信息, 作者: lostsnow.http://www.lsproc.com/blog/use_ob_flush_on_nginx_fastcgi/ Nginx与php-cgi是两个独立的程序，通过TCP或Unix套接字通信，不像Apache那样是集成在一起的。所以，Nginx有fastcgi 缓冲区，数据超出缓冲区大小、或程序执行完，才会将内容输出到客户端。如果要使用ob_flush，不能开启gzip压缩输出。 nginx.conf: fastcgi_buffer_size 4k; fastcgi_buffers 8 4k; gzip off; php.ini: output_buffering = Off &#60;?php set_time_limit(0); ob_end_clean(); ob_implicit_flush(1); for($i = 0; $i &#60; 10; $i++) { echo $i . &#34;&#60;br /&#62;\n&#34;; echo str_repeat(&#039; &#039;, 1024*4); sleep(1); } &#8230; <a href="http://www.lsproc.com/blog/use_ob_flush_on_nginx_fastcgi/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>转载时请标明文章原始出处和作者信息, 作者: <a href="http://www.lsproc.com/blog/">lostsnow</a>.<br /><a href="http://www.lsproc.com/blog/use_ob_flush_on_nginx_fastcgi/">http://www.lsproc.com/blog/use_ob_flush_on_nginx_fastcgi/</a></p>
<p>Nginx与php-cgi是两个独立的程序，通过TCP或Unix套接字通信，不像Apache那样是集成在一起的。所以，Nginx有fastcgi 缓冲区，数据超出缓冲区大小、或程序执行完，才会将内容输出到客户端。<strong>如果要使用ob_flush，不能开启gzip压缩输出。</strong></p>
<p>nginx.conf:</p>
<pre class="brush: text">fastcgi_buffer_size 4k;
fastcgi_buffers 8 4k;
gzip off;</pre>
<p>php.ini:</p>
<pre class="brush: text">
output_buffering = Off
</pre>
<pre class="brush: php">
&lt;?php
set_time_limit(0);
ob_end_clean();
ob_implicit_flush(1);

for($i = 0; $i &lt; 10; $i++)
{
    echo $i . &quot;&lt;br /&gt;\n&quot;;
    echo str_repeat(&#039; &#039;, 1024*4);
    sleep(1);
}
</pre>
<p>其中 echo str_repeat(' ', 1024*4);<br />
使得fastcgi_buffer_size 4k; 的缓冲区满，从而输出内容到浏览器</p>
<p>参考: http://blog.s135.com/nginx_php_v6/2/1/
<p>-- EOF --</p>
<h2  class="related_post_title">Related Posts</h2><ul class="related_post"><li>2010-05-21 -- <a href="http://www.lsproc.com/blog/nginx_php_pathinfo_securit/" title="Nginx/PHP 文件类型错误解析漏洞：fix_pathinfo">Nginx/PHP 文件类型错误解析漏洞：fix_pathinfo</a> (2)</li><li>2010-04-12 -- <a href="http://www.lsproc.com/blog/nginx_userid_decode/" title="nginx userid 模块客户端 cookie 解码">nginx userid 模块客户端 cookie 解码</a> (0)</li><li>2008-06-15 -- <a href="http://www.lsproc.com/blog/lighttpd_phpfastcgi_config/" title="lighttpd + PHP(fastcgi) 配置">lighttpd + PHP(fastcgi) 配置</a> (0)</li><li>2009-03-29 -- <a href="http://www.lsproc.com/blog/nginx_ssl_config/" title="Nginx SSL 配置">Nginx SSL 配置</a> (23)</li><li>2008-10-23 -- <a href="http://www.lsproc.com/blog/nginx_rewrite_param/" title="nginx rewrite 的一些参数  ">nginx rewrite 的一些参数  </a> (1)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.lsproc.com/blog/use_ob_flush_on_nginx_fastcgi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nginx SSL 配置</title>
		<link>http://www.lsproc.com/blog/nginx_ssl_config/</link>
		<comments>http://www.lsproc.com/blog/nginx_ssl_config/#comments</comments>
		<pubDate>Sun, 29 Mar 2009 13:19:50 +0000</pubDate>
		<dc:creator>lostsnow</dc:creator>
				<category><![CDATA[Linux&Webserver]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[ssl]]></category>

		<guid isPermaLink="false">http://www.lostk.com/blog/?p=288</guid>
		<description><![CDATA[转载时请标明文章原始出处和作者信息, 作者: lostsnow.http://www.lsproc.com/blog/nginx_ssl_config/ 使用OpenSSL生成证书 1、生成RSA密钥的方法 openssl genrsa -des3 -out privkey.pem 2048 这个命令会生成一个2048位的密钥，同时有一个des3方法加密的密码，如果你不想要每次都输入密码，可以改成： openssl genrsa -out privkey.pem 2048 建议用2048位密钥，少于此可能会不安全或很快将不安全。 2、生成一个证书请求 openssl req -new -key privkey.pem -out cert.csr 这个命令将会生成一个证书请求，当然，用到了前面生成的密钥privkey.pem文件 这里将生成一个新的文件cert.csr，即一个证书请求文件，你可以拿着这个文件去数字证书颁发机构（即CA）申请一个数字证书。CA会给你一个新的文件cacert.pem，那才是你的数字证书。 如果是自己做测试，那么证书的申请机构和颁发机构都是自己。就可以用下面这个命令来生成证书： openssl req -new -x509 -key privkey.pem -out cacert.pem -days 1095 这个命令将用上面生成的密钥privkey.pem生成一个数字证书cacert.pem &#8230; <a href="http://www.lsproc.com/blog/nginx_ssl_config/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>转载时请标明文章原始出处和作者信息, 作者: <a href="http://www.lsproc.com/blog/">lostsnow</a>.<br /><a href="http://www.lsproc.com/blog/nginx_ssl_config/">http://www.lsproc.com/blog/nginx_ssl_config/</a></p>
<p><strong>使用OpenSSL生成证书</strong></p>
<p>1、生成RSA密钥的方法</p>
<p>openssl genrsa -des3 -out privkey.pem 2048<br />
这个命令会生成一个2048位的密钥，同时有一个des3方法加密的密码，如果你不想要每次都输入密码，可以改成：<br />
openssl genrsa -out privkey.pem 2048<br />
建议用2048位密钥，少于此可能会不安全或很快将不安全。</p>
<p>2、生成一个证书请求<br />
openssl req -new -key privkey.pem -out cert.csr<br />
这个命令将会生成一个证书请求，当然，用到了前面生成的密钥privkey.pem文件<br />
这里将生成一个新的文件cert.csr，即一个证书请求文件，你可以拿着这个文件去数字证书颁发机构（即CA）申请一个数字证书。CA会给你一个新的文件cacert.pem，那才是你的数字证书。</p>
<p>如果是自己做测试，那么证书的申请机构和颁发机构都是自己。就可以用下面这个命令来生成证书：<br />
openssl req -new -x509 -key privkey.pem -out cacert.pem -days 1095<br />
这个命令将用上面生成的密钥privkey.pem生成一个数字证书cacert.pem</p>
<p><strong>配置nginx</strong></p>
<pre class="brush: text">
server
{
    listen       443;
    ssl on;
    ssl_certificate  /var/www/sslkey/cacert.pem;
    ssl_certificate_key /var/www/sslkey/privkey.pem;
    server_name  192.168.1.1;
    index index.html index.htm index.php;
    root  /var/www/test;

    .....
    ...
}
</pre>
<p>-- EOF --</p>
<h2  class="related_post_title">Related Posts</h2><ul class="related_post"><li>2010-05-21 -- <a href="http://www.lsproc.com/blog/nginx_php_pathinfo_securit/" title="Nginx/PHP 文件类型错误解析漏洞：fix_pathinfo">Nginx/PHP 文件类型错误解析漏洞：fix_pathinfo</a> (2)</li><li>2010-04-12 -- <a href="http://www.lsproc.com/blog/nginx_userid_decode/" title="nginx userid 模块客户端 cookie 解码">nginx userid 模块客户端 cookie 解码</a> (0)</li><li>2010-03-08 -- <a href="http://www.lsproc.com/blog/use_ob_flush_on_nginx_fastcgi/" title="nginx+factcgi 下使用 ob_flush">nginx+factcgi 下使用 ob_flush</a> (0)</li><li>2008-10-23 -- <a href="http://www.lsproc.com/blog/nginx_rewrite_param/" title="nginx rewrite 的一些参数  ">nginx rewrite 的一些参数  </a> (1)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.lsproc.com/blog/nginx_ssl_config/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>nginx rewrite 的一些参数</title>
		<link>http://www.lsproc.com/blog/nginx_rewrite_param/</link>
		<comments>http://www.lsproc.com/blog/nginx_rewrite_param/#comments</comments>
		<pubDate>Thu, 23 Oct 2008 07:28:38 +0000</pubDate>
		<dc:creator>lostsnow</dc:creator>
				<category><![CDATA[Linux&Webserver]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[url_rewrite]]></category>

		<guid isPermaLink="false">http://www.lostk.com/blog/?p=155</guid>
		<description><![CDATA[转载时请标明文章原始出处和作者信息, 作者: lostsnow.http://www.lsproc.com/blog/nginx_rewrite_param/ 正则表达式匹配，其中： * ~ 为区分大小写匹配 * ~* 为不区分大小写匹配 * !~和!~*分别为区分大小写不匹配及不区分大小写不匹配 文件及目录匹配，其中： * -f和!-f用来判断是否存在文件 * -d和!-d用来判断是否存在目录 * -e和!-e用来判断是否存在文件或目录 * -x和!-x用来判断文件是否可执行 flag标记有： * last 相当于Apache里的[L]标记，表示完成rewrite * break 终止匹配, 不再匹配后面的规则 * redirect 返回302临时重定向 * permanent 返回301永久重定向 一些可用的全局变量有，可以用做条件判断(待补全) $args $content_length $content_type $document_root &#8230; <a href="http://www.lsproc.com/blog/nginx_rewrite_param/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>转载时请标明文章原始出处和作者信息, 作者: <a href="http://www.lsproc.com/blog/">lostsnow</a>.<br /><a href="http://www.lsproc.com/blog/nginx_rewrite_param/">http://www.lsproc.com/blog/nginx_rewrite_param/</a></p>
<p>正则表达式匹配，其中：</p>
<blockquote><p>   * ~  为区分大小写匹配<br />
   * ~* 为不区分大小写匹配<br />
   * !~和!~*分别为区分大小写不匹配及不区分大小写不匹配</p></blockquote>
<p>文件及目录匹配，其中：</p>
<blockquote><p>   * -f和!-f用来判断是否存在文件<br />
   * -d和!-d用来判断是否存在目录<br />
   * -e和!-e用来判断是否存在文件或目录<br />
   * -x和!-x用来判断文件是否可执行</p></blockquote>
<p>flag标记有：</p>
<blockquote><p>   * last 相当于Apache里的[L]标记，表示完成rewrite<br />
   * break 终止匹配, 不再匹配后面的规则<br />
   * redirect 返回302临时重定向<br />
   * permanent 返回301永久重定向</p></blockquote>
<p>一些可用的全局变量有，可以用做条件判断(待补全)</p>
<blockquote><p>$args<br />
$content_length<br />
$content_type<br />
$document_root<br />
$document_uri<br />
$host<br />
$http_user_agent<br />
$http_cookie<br />
$limit_rate<br />
$request_body_file<br />
$request_method<br />
$remote_addr<br />
$remote_port<br />
$remote_user<br />
$request_filename<br />
$request_uri<br />
$query_string<br />
$scheme<br />
$server_protocol<br />
$server_addr<br />
$server_name<br />
$server_port<br />
$uri</p></blockquote>
<p>举例:<br />
abc.domian.com/sort/2 => abc.domian.com/index.php?act=sort&#038;name=abc&#038;id=2</p>
<pre class="brush: text">if ($host ~* (.*)\.domain\.com) {
    set $sub_name $1;
    rewrite ^/sort\/(\d+)\/?$ /index.php?act=sort&amp;cid=$sub_name&amp;id=$1 last;
}</pre>
<p><a href="http://wiki.codemongers.com/NginxChsHttpRewriteModule">http://wiki.codemongers.com/NginxChsHttpRewriteModule</a><br />
<a href="http://www.romej.com/archives/515/nginx-rewrite-rules-for-wordpress-redux">http://www.romej.com/archives/515/nginx-rewrite-rules-for-wordpress-redux</a><br />
<a href="http://info.codepub.com/2008/08/info-21590.html">http://info.codepub.com/2008/08/info-21590.html</a>
<p>-- EOF --</p>
<h2  class="related_post_title">Related Posts</h2><ul class="related_post"><li>2010-05-21 -- <a href="http://www.lsproc.com/blog/nginx_php_pathinfo_securit/" title="Nginx/PHP 文件类型错误解析漏洞：fix_pathinfo">Nginx/PHP 文件类型错误解析漏洞：fix_pathinfo</a> (2)</li><li>2010-04-12 -- <a href="http://www.lsproc.com/blog/nginx_userid_decode/" title="nginx userid 模块客户端 cookie 解码">nginx userid 模块客户端 cookie 解码</a> (0)</li><li>2010-03-08 -- <a href="http://www.lsproc.com/blog/use_ob_flush_on_nginx_fastcgi/" title="nginx+factcgi 下使用 ob_flush">nginx+factcgi 下使用 ob_flush</a> (0)</li><li>2009-03-29 -- <a href="http://www.lsproc.com/blog/nginx_ssl_config/" title="Nginx SSL 配置">Nginx SSL 配置</a> (23)</li><li>2008-03-21 -- <a href="http://www.lsproc.com/blog/useful_apache_urlrewrite/" title="一些有用apache重写规则">一些有用apache重写规则</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.lsproc.com/blog/nginx_rewrite_param/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

