要验证SSL证书,我需要上传一个隐藏文件夹(" /。众所周知的"包含一些文件到我的应用程序。
我正在使用eclipse部署java应用程序,但这些文件不会在appengine上的应用程序中接收。我想它们已被过滤掉了。
我尝试将隐藏文件夹作为静态文件添加到appengine-web.xml中,但它没有帮助。
<!-- Configure serving/caching of GWT files -->
<static-files>
<include path="**" />
<include path=".**" />
<include path="**.*" expiration="0s" />
<include path="**.well-known" expiration="0s" />
<include path="**.nocache.*" expiration="0s" />
<include path="**.cache.*" expiration="365d" />
<include path="**.css" expiration="30d"/>
<exclude path="**.gwt.rpc" />
<exclude path="**.html" />
</static-files>
我是如何上传这些文件夹和文件的?
答案 0 :(得分:3)
对于像我这样的人在尝试以静态方式在Google App Engine中为letsencrypt提供挑战并且失败之后,以下其他人来到我这里:以下为我做了这样的事情:(其中一个人可能真的可以静态地执行此操作,但我没有不要尝试,因为我不想花更多的时间尝试一些东西,Ian显然已经尝试过并且无法使其工作[也许在Google App Engine内部完成的复制命令会忽略以点开头的目录])< / p>
取自http://igorartamonov.com/2015/12/lets-encrypt-ssl-google-appengine/学分归Igor Artamonov。
只需构建一个servlet:
公共类LetsencryptServlet扩展了HttpServlet {
public static final Map<String, String> challenges = new HashMap<String, String>();
static {
challenges.put("RzrvZ9gd7EH3i_TsJM-B0vdEMslD4oo_lwsagGskp6c",
"RzrvZ9gd7EH3i_TsJM-B0vdEMslD4oo_lwsagGskp6c.ONrZa3UelibSWEX270nTUiRZKPFXw096nENWbMGw0-E");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
if (!req.getRequestURI().startsWith("/.well-known/acme-challenge/")) {
resp.sendError(404);
return;
}
String id = req.getRequestURI().substring("/.well-known/acme-challenge/".length());
if (!challenges.containsKey(id)) {
resp.sendError(404);
return;
}
resp.setContentType("text/plain");
resp.getOutputStream().print(challenges.get(id));
}
}
并添加到web.xml
,如:
<servlet>
<servlet-name>letsencrypt</servlet-name>
<servlet-class>...LetsencryptServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>letsencrypt</servlet-name>
<url-pattern>/.well-known/acme-challenge/*</url-pattern>
</servlet-mapping>
当然,请确保servlet类具有创建的Servlet的完整类路径。
该博客文章还涉及生成和安装证书所需的其他步骤。
Ian:你确定你正在部署servlet吗?检查日志,确保您正在测试正确的版本..也许您有编译问题..
干杯
答案 1 :(得分:2)
我在尝试提供assetlinks.json
文件时遇到了这个问题。确实会出现以a开头的文件夹。在App Engine的静态上下文中无法访问。 JoãoAntunes解决方法的更通用版本如下。
首先,创建没有的文件夹。在开始时将任何所需的文件放在其中。
然后我们需要创建一个servlet,当收到对隐藏文件夹的请求时,它将使用正确的数据进行响应。
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
/**
* Created by Will Calderwood on 17/05/2017.
* <p>
* It would appear to not be possible to upload hidden folders to app engine. So when files need
* to be served from a hidden folder the URL can be bounced through this servlet
*/
public class StaticFileServer extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// We'll remove the dots from the path
String uri = req.getRequestURI().replace("/.", "/");
// Do anything else that needs doing here
if (uri.toLowerCase().contains(".json")) {
resp.setContentType("application/json");
}
// Read and return the resource from the non-hidden folder
try (InputStream in = getServletContext().getResourceAsStream(uri)) {
if (in == null){
resp.sendError(404);
return;
}
byte[] buffer = new byte[8192];
int count;
while ((count = in.read(buffer)) > 0) {
resp.getOutputStream().write(buffer, 0, count);
}
}
}
}
然后将以下内容添加到web.xml
文件中,以将隐藏文件夹指向我们的servlet
<servlet>
<servlet-name>StaticFileServer</servlet-name>
<servlet-class>main.com.you.StaticFileServer</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>StaticFileServer</servlet-name>
<url-pattern>/.well-known/*</url-pattern>
</servlet-mapping>
答案 2 :(得分:1)
静态文件未上传到应用程序服务器,因此应用程序代码无法访问。来自<static-files>
部分的appengine-web.xml Reference:
<强>&LT;静态文件&gt;
可选。 &lt; static-files&gt; 元素指定模式 匹配文件路径以包含和排除静态文件列表, 覆盖或修改默认行为。提供静态文件 来自独立的专用服务器和缓存 应用程序服务器,可用于提供静态内容,例如 图像,CSS样式表或JavaScript文件。
要让应用代码可以访问文件,需要在<resource-files>
部分指定(与上述相同的文档):
<强>&LT;资源文件&gt;
可选。 &lt;中列出的文件资源文件&gt; 元素是 可以使用文件系统通过应用程序代码访问。这些文件 与应用程序存储在应用程序服务器上,而不是如何 静态文件存储和提供。
答案 3 :(得分:0)
我尝试了一切,但无法设法上传该隐藏文件夹。然后我为该路径定义了一个servlet映射,servlet写出了SSL发行者预期的验证字符串:
<servlet-mapping>
<servlet-name>SSLVerificationServlet</servlet-name>
<url-pattern>/.well-known/acme-challenge/roQH_vUmRQsuKH8lZGedft9O6TK-UoZWzv_kY8MukH4F8</url-pattern>
</servlet-mapping>
答案 4 :(得分:0)
我找到了更好的方法,问题是代码存储在隐藏目录中,因此我们只需要将正确的URL映射到可见目录。
handlers:
- url: /.well-known
static_dir: _well-known
答案 5 :(得分:0)
一个丑陋但简单的解决方法是使用JSP支持来映射页面。一个例子:
在package/src/main/webapp/_well-known/assetlinks.json.jsp
中创建您的json文件
<%@ page contentType="application/json;charset=UTF-8" language="java"%>
[JSON CONTENT]
将“ servlet”映射到web.xml
中的所需路径:
<servlet>
<servlet-name>Asset Links</servlet-name>
<jsp-file>/_well-known/assetlinks.json.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>Asset Links</servlet-name>
<url-pattern>/.well-known/assetlinks.json</url-pattern>
</servlet-mapping>
完成!