我需要构建一个从外部公司使用RESTful API的应用程序。我消耗的数据很敏感,因此显然需要HTTPS。
我的问题是我能够从外部公司读取信息而无需配置任何类型的SSL证书。我没有在我的代码中进行任何加密/解密。
我唯一能让我相信数据安全的是,RESTful调用仅适用于网址中的https
,而不是http
。
我使用Spring RestTemplate来使用Web服务,如下所示:
List<Info> getInfo(Map<String, Object> urlParamMap, HttpSession httpSession){
HttpEntity<String> request = new HttpEntity<String>(httpSession.getHttpHeaders());
restTemplate.setMessageConverters(httpSession.getMessageConverterList());
ResponseEntity<JsonData> responseEntity = restTemplate.exchange("https://outsideOrg.com/{parameter}, HttpMethod.GET, request, JsonData.class, urlParamMap);
List<Info> infoList = responseEntity.getBody().getInfoList();
return infoList;
}
这是我的一些http设置,包括授权和一些反序列化设置:
public class HttpSession {
static Logger log = Logger.getLogger(HttpSession.class);
private HttpHeaders httpHeaders;
private List<HttpMessageConverter<?>> messageConverterList;
HttpHeaders getHttpHeaders() {
return httpHeaders;
}
void setHttpHeaders(HttpHeaders httpHeaders) {
this.httpHeaders = httpHeaders;
}
List<HttpMessageConverter<?>> getMessageConverterList() {
return messageConverterList;
}
void setMessageConverterList(List<HttpMessageConverter<?>> messageConverterList) {
this.messageConverterList = messageConverterList;
}
void createHeaders(){
HttpHeaders httpHeaders = new HttpHeaders();
try {
File xmlFile = new File("C:/Users/User/docs/RestAuth.xml");
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document document = documentBuilder.parse(xmlFile);
String username = document.getElementsByTagName("username").item(0).getTextContent();
String password = document.getElementsByTagName("password").item(0).getTextContent();
String authorization = username + ":" + password;
byte[] encodedAuthorization = Base64.encodeBase64(authorization.getBytes(Charset.forName("US-ASCII")));
String authorizationHeader = "Basic " + new String(encodedAuthorization);
httpHeaders.set("Authorization", authorizationHeader);
httpHeaders.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
}catch (ParserConfigurationException | SAXException | IOException e) {
log.error("There was an error setting the credentials.", e);
}
this.httpHeaders = httpHeaders;
}
void setupMessageConverters(){
List<HttpMessageConverter<?>> messageConverterList = new ArrayList<>();
MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
messageConverter.setObjectMapper(objectMapper);
messageConverterList.add(messageConverter);
this.messageConverterList = messageConverterList;
}
我很困惑我需要做什么包括SSL证书(如果需要),并加密/解密数据。外部网站在没有要求SSL证书的情况下返回看似未加密的信息是一个问题吗?
我是SSL新手,对REST来说相对较新,所以请原谅我对这个主题的无知。我们可以提供任何可以提供的帮助或我可以提供的资源!
答案 0 :(得分:0)
JRE包含一个信任存储,其中包含某些公共CA的证书。如果公司使用由其中一个受信任的CA签名的证书,则JRE可以建立SSL连接而无需进一步配置。否则,您将收到一条错误消息,证明该证书不受信任。
如果您指定了HTTPS网址,则JRE将始终尝试设置加密连接。如果它不起作用,你会得到一个例外。