Coldfusion 11的REST服务可以使用HTTP协议,但无法使用HTTPS协议(404错误)。

3

我正在尝试利用Coldfusion 11的REST服务,但只能使用HTTP协议,无法使用HTTPS。当我将协议更改为HTTPS时,它返回404错误。

我已经采取的步骤:

1)我在Web根目录中创建了一个名为“api-test”的文件夹

2)在该文件夹内,我创建了一个名为“animals.cfc”的文件,其中包含:

<cfcomponent rest="true" restpath="/animals">
        <cffunction name="getAnimals" access="remote" httpmethod="GET" produces="application/json" returntype="struct">
                <cfset value = { "cats": "dogs", "birds": "snakes" }>
                <cfreturn value>
        </cffunction>
</cfcomponent>

3) 在 Coldfusion 管理员 中的 Data & Services / REST Services 下,我将 "/web/webapps/api-test" 添加为 根路径,并将 "api-test" 添加为 映射

4) 在我的 Web 浏览器中,通过 jQuery 和 Firefox 的 Firebug / Web Developer 插件,在同一服务器上登录到其中一个 CF Web 应用程序后 (使用 HTTP),我测试了 API:

$.get("http://cftestapp1.mydomain.com/rest/api-test/animals");

数据返回没有问题。

5)当我将CF Web应用程序的协议更改为HTTPS并使用相同的命令重试时,在我的Web浏览器中会出现404错误。

$.get("https://cftestapp1.mydomain.com/rest/api-test/animals");

我的环境由两个 Web 服务器(cftestapp1 和 cftestapp2)和一个负载均衡器(cftestapps)组成。Web 服务器在 Redhat Linux 上运行 Coldfusion 11,使用 Apache/Tomcat。在测试过程中,我首先尝试了所有负载均衡器的设置,但没有成功,然后我只关注于 "cftestapp1"(如上面的例子)。我查看了所有 Coldfusion 管理员设置和 Apache 的 httpd.conf 文件,但都没有找到问题所在。
我在网上找不到太多相关文档或者有任何人遇到过同样的问题。如果有人有任何见解,请帮忙!谢谢!
编辑:
每次进行 HTTPS 请求时,/etc/httpd/logs/ssl_error_log(在 httpd.conf 中指定)都会显示以下错误:

[Tue Nov 24 16:34:23 2015] [error] [client my_ip_here] File does not exist: /web/webapps/rest
[Tue Nov 24 16:34:23 2015] [error] [client my_ip_here] File does not exist: /web/webapps/opt

/web/webapps/rest 是我请求的资源,但是并没有名为 "rest" 的物理文件;我的 Coldfusion Administrator 的 Rest Services 条目应该处理这些重定向。 /web/webapps/opt 看起来是 Apache 尝试提供 404 页面,但是这个页面不在网站根目录中,而是在 /opt 目录深处。
我还发现了这个错误,可能与问题无关,因为我们在添加 CF Rest Services 之前从未遇到过 HTTPS 请求的问题。

[Tue Nov 24 16:33:12 2015] [warn] RSA server certificate is a CA certificate (BasicConstraints: CA == TRUE !?)

下面是我们 Apache 配置文件(httpd.conf)的摘录。还有许多其他行,但这些似乎是最相关的。
<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>

<Directory "/web/webapps">
 Options FollowSymLinks
 AllowOverride None
 Order allow,deny
 Allow from all
</Directory>

Include "/etc/httpd/conf/mod_jk.conf"

NameVirtualHost 127.0.0.1:443
<VirtualHost 127.0.0.1:443>
        ServerName localhost
        DocumentRoot /web/webapps/
        SSLEngine on
        SSLCertificateFile /etc/pki/tls/certs/localhost.crt
        SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
        SSLProtocol +SSLv3 +TLSv1
        SSLCipherSuite RSA:!EXP:!NULL:+HIGH:-MEDIUM:-LOW
        ErrorLog logs/cfadmin.ssl.error.log
        CustomLog logs/cfadmin.ssl.access.log common
</VirtualHost>

ErrorDocument 404 /opt/cf11/cfusion/wwwroot/CFIDE/administrator/templates/404.cfm

看起来HTTPS流量在404和REST服务上没有被正确路由。但是在使用HTTPS时,我能够访问我们/web/webapps网站根目录中的所有其他文件夹,没有任何问题。


如果您在浏览器中简单地访问URL https://cftestapp1.mydomain.com/rest/api-test/animals,它是否有效?我意识到它可能会出现错误或类似的问题,但它是否能够解决?您是否已经将证书导入到服务器上的Java密钥库文件(cacerts)中? - Miguel-F
将SSL证书添加到密钥库中并不能解决问题。但是在Web浏览器中直接访问URL已被证明更为容易:使用HTTP,它显示JSON。使用HTTPS,我得到了Apache的404页面。但是,如果我在HTTP中在“_/rest/”之后断开链接http://cftestapp1.mydomain.com/rest/api-test-break-me/animals,我会得到一个空白页面。如果我在HTTP中在“/rest/_”之前断开链接https://cftestapp1.mydomain.com/break-me/rest/api-test/animals,我将得到Coldfusion的404错误。这可能是我们的Apache配置的问题。我已更新我的问题以包含更多有关此事的详细信息。谢谢! - Thomas B
愚蠢问题#35:在CF管理中的Rest服务配置中,您在host字段中有什么?助手文本建议您可能需要在其中添加端口号,您是否有两个条目(每个条目分别用于HTTP和HTTPS)? - Juffy
2个回答

2
My problem已经解决了。我找到了两个不同的解决方案,其中一个是基于mt0的响应,另一个是基于Adobe的帮助(https://helpx.adobe.com/coldfusion/installing/configuring-your-system.html)。 解决方案#1。 编辑/etc/httpd/conf/httpd.conf 我在我的SSL VirtualHost指令中添加了以下行:
<VirtualHost 127.0.0.1:443>
    JKMountFile "/path/to/ColdFusion11/config/wsconfig/1/uriworkermap.properties"

然而,只有在我将本地IP地址(127.0.0.1)更改为服务器的IP地址时,NameVirtualHostVirtualHost才能正常工作。(使用 *:443 是不起作用的)

NameVirtualHost SERVER_IP_HERE:443
<VirtualHost SERVER_IP_HERE:443>

虽然这解决了问题,但我不想在配置文件中硬编码服务器的IP地址。因此,我继续研究并找到了这个备选方案:

方案 #2(首选)。

编辑 /etc/httpd/conf.d/ssl.conf 文件(保留 httpd.conf 文件原始状态)。

我在我的 SSL VirtualHost 指令中添加了以下行,并重新启动了 Apache:

<VirtualHost _default_:443>
    JKMountFile "/path/to/ColdFusion11/config/wsconfig/1/uriworkermap.properties" 

这解决了我的问题。 谢谢大家的帮助!

1
你的虚拟主机对ColdFusion一无所知。如果你查看/etc/httpd/conf/mod_jk.conf文件,它会有一行类似于:
JKMountFile "/path/to/ColdFusion11/config/wsconfig/1/uriworkermap.properties"

这是针对HTTP服务的调用(通过配置文件中的Include "/etc/httpd/conf/mod_jk.conf"),而不是针对HTTPS服务的。

你只需要将这一行复制到虚拟主机声明中的httpd.conf文件中,像这样:

<VirtualHost 127.0.0.1:443>
  ServerName localhost
  DocumentRoot /web/webapps/
  SSLEngine on
  SSLCertificateFile /etc/pki/tls/certs/localhost.crt
  SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
  SSLProtocol +SSLv3 +TLSv1
  SSLCipherSuite RSA:!EXP:!NULL:+HIGH:-MEDIUM:-LOW
  ErrorLog logs/cfadmin.ssl.error.log
  CustomLog logs/cfadmin.ssl.access.log common

  JKMountFile "/path/to/ColdFusion11/config/wsconfig/1/uriworkermap.properties"
</VirtualHost>

然后虚拟主机将会知道在哪里找到服务。

谢谢!您的信息帮助我解决了问题。在我的Apache VirtualHost配置中包含uriworkermap.properties是处理我的REST服务所必需的。但我更改了ssl.conf而不是httpd.conf。我已经添加了一个答案,详细说明了我的步骤。感谢您的帮助! - Thomas B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接