我是 Apache 新手,当我的网站调用 ajax 到 api 服务器时遇到了问题。
例子:
https://example.com:11721
(自签名证书)
https://api.example.com
(自签名证书)
GET 请求:
https://example.com:11721/api/message -> https://api.example.com/api/message
PUT 请求:
https://example.com:11721/api/message/read -> https://api.example.com/api/message/read
我的配置可以调用 get 请求,但 put/post 请求响应(403 禁止)。
这是我的 Apache 配置:
<IfDefine SSL>
<VirtualHost *:11721>
ServerName https://example.com
ServerAlias example.com
RewriteEngine on
include conf/security.conf
include conf/method.conf
include conf/extension.conf
include app_conf.d/https.mydomain.conf
SetEnv SERVER_URL https://example.com
SetEnv HTTPS ON
#add SSL
SSLEngine on
# ---- Bellow config allow get request but put/post request response 403, if don't config follow it server will response 500.----------
SSLProxyEngine on
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off
# ------ END ---------
ProxyPass "/api" "https://ip-api-sever/api"
ProxyPassReverse "/api" "https://ip-api-sever/api"
SSLCertificateFile "/usr/local/apache/2.4.10/conf/server.crt"
SSLCertificateKeyFile "/usr/local/apache/2.4.10/conf/server.key"
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
CustomLog "|/usr/local/apache/2.4/bin/rotatelogs /var/apachelog/common/ssl/access.log.%Y%m%d%H%M%S 3600 +540" fanformat env=!images
#mod_balancer
include conf.d/proxy.https.mydomain.conf
</VirtualHost>
</IfDefine>
请帮助我,谢谢
感谢您的支持。
按照你的说明更改配置后,我认为你是对的。但我又遇到了另一个错误。
我的错误日志:
[2018 年 4 月 19 日星期四 16:21:46.115579] [ssl:debug] [pid 1183] ssl_engine_kernel.c(1378): [remote xx.xx.xx.xx:443] AH02275: 证书验证,深度 2,CRL 检查模式:无 [主题:CN=VeriSign Class 3 Public Primary Certification Authority - G5,OU=(c) 2006 VeriSign\, Inc. - 仅供授权使用,OU=VeriSign Trust Network,O=VeriSign\, Inc.,C=US / 发行人:OU=Class 3 Public Primary Certification Authority,O=VeriSign\, Inc.,C=US / 序列号:xxxxxxxxxx/ notbefore:2006 年 11 月 8 日 00:00:00 GMT / notafter:2021 年 11 月 7 日 23:59:59 GMT]
[2018 年 4 月 19 日星期四 16:21:46.115703] [ssl:info] [pid 1183] [remote xx.xx.xx.xx:443] AH02276:证书验证:错误 (20):无法获取本地颁发者证书 [主题:CN=VeriSign Class 3 Public Primary Certification Authority - G5,OU=(c) 2006 VeriSign\, Inc. - 仅供授权使用,OU=VeriSign Trust Network,O=VeriSign\, Inc.,C=US / 颁发者:OU=Class 3 Public Primary Certification Authority,O=VeriSign\, Inc.,C=US / 序列号:xxxxxxxxxxxxxxxxxx/ notbefore:2006 年 11 月 8 日 00:00:00 GMT / notafter:2021 年 11 月 7 日 23:59:59 GMT]
[2018 年 4 月 19 日星期四 16:21:46.115902] [ssl:info] [pid 1183] [远程 xx.xx.xx.xx:443] AH02003:SSL 代理连接失败
[2018 年 4 月 19 日星期四 16:21:46.115960] [ssl:info] [pid 1183] SSL 库错误:错误:14090086:SSL 例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败
[2018 年 4 月 19 日星期四 16:21:46.115979] [ssl:info] [pid 1183] [远程 xx.xx.xx.xx:443] AH01998:与子进程 0 的连接已关闭,且关闭中止(服务器 mydomain:443)
[2018 年 4 月 19 日星期四 16:21:46.116014] [ssl:info] [pid 1183] [远程 xx.xx.xx.xx:443] AH01997:SSL 握手失败:发送 502
[2018 年 4 月 19 日星期四 16:21:46.116064] [proxy_http:error] [pid 1183] (103)软件导致连接中止:[客户端 10.128.14.1:48138] AH01102:从远程服务器 xx.xx.xx.xx:443 读取状态行时出错 [2018 年 4 月 19 日星期四 16:21:46.116115] [proxy_http:debug] [pid 1183] mod_proxy_http.c(1369):[客户端 10.128.14.1:48138] AH01105:尽管从后端服务器 xx.xx.xx.xx:443 读取失败,但未关闭与客户端的连接。
你知道该如何解决这个问题吗?
谢谢。
答案1
您提到您在代理服务器上使用自签名证书。在这种情况下,您必须包含 SSLProxyCACertificateFile 指令,以便让当前服务器信任代理服务器提供的自签名证书。请记住,还要包含 CA 证书的路径。
需要更改/添加的配置部分:
SSLProxyVerify require
SSLProxyVerifyDepth 1
SSLProxyCACertificateFile "/path/to/the/CACertifcateFile"
SSLProxyCheckPeerName on
因此你的整个配置文件应该是这样的:
<IfDefine SSL>
<VirtualHost *:11721>
#----Local Configuration:#
ServerName https://example.com
ServerAlias example.com
RewriteEngine on
include conf/security.conf
include conf/method.conf
include conf/extension.conf
include app_conf.d/https.mydomain.conf
SetEnv SERVER_URL https://example.com
SetEnv HTTPS ON
SSLEngine on
SSLCertificateFile "/usr/local/apache/2.4.10/conf/server.crt"
SSLCertificateKeyFile "/usr/local/apache/2.4.10/conf/server.key"
#----Proxy Configuration:#
SSLProxyEngine on
ProxyRequest off
ProxyPass "/api" "https://ip-api-sever/api"
ProxyPassReverse "/api" "https://ip-api-sever/api"
SSLProxyVerify require
SSLProxyVerifyDepth 1
SSLProxyCACertificateFile "/path/to/the/CACertifcateFile"
SSLProxyCheckPeerName on
#----Local Configuration:#
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
CustomLog "|/usr/local/apache/2.4/bin/rotatelogs /var/apachelog/common/ssl/access.log.%Y%m%d%H%M%S 3600 +540" fanformat env=!images
#mod_balancer
include conf.d/proxy.https.mydomain.conf
</VirtualHost>
</IfDefine>
答案2
您缺少"
ProxyPassReverse 指令。这就是 GET 请求有效而 POST/PUT 请求无效的原因。
改变这个:
ProxyPass "/api" "https://ip-api-sever/api"
ProxyPassReverse /api" "https://ip-api-sever/api"
对此:
ProxyPass "/api" "https://ip-api-sever/api"
ProxyPassReverse "/api" "https://ip-api-sever/api"