步骤:
1.设置application.yml
spring:
mail:
host: smtp.exmail.qq.com
username: 你的QQ
password: 授权码
port: 465
default-encoding: UTF-8
testConnection: false
properties:
mail:
smtp:
auth: true
socketFactory:
class: javax.net.ssl.SSLSocketFactory
ssl:
enable: true
starttls:
enable: true
required: true
2.html页面
<!DOCTYPE html>
<html lang="en">
<head>
<title>注册</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="keywords" content="" />
<script type="application/x-javascript"> addEventListener("load", function() { setTimeout(hideURLbar, 0); }, false); function hideURLbar(){ window.scrollTo(0,1); } </script>
<link href='https://fonts.googleapis.com/css?family=Muli:400,300' rel='stylesheet' type='text/css'>
<link href='https://fonts.googleapis.com/css?family=Nunito:400,300,700' rel='stylesheet' type='text/css'>
<link href="/config/style_m.css" rel='stylesheet' type='text/css' media="all" />
</head>
<body style="margin: 0px;margin-top: 85px;">
<div class="div1">
<div class="inner">
<h1></h1>
<div class="log">
<div class="content2" style="">
<h2>找回密码</h2>
<!--<label class="" >用户名</label>-->
<input class=" " type="text" placeholder="Please input username" id="username" name="username" autofocus="autofocus" maxlength="20"/>
<p style="margin-top: 10px;"> <button class=" " id="code-button" onclick="sendCode()" data-loading-text="发送中...">发送邮件</button></p>
<!--<label class="">验证码</label><span class="">*</span>-->
<input class=" " type="text" placeholder="Please input verification code " name="code" id="code">
<!--<label class="">新密码</label><span class="">*</span>-->
<input class="" type="password" placeholder="Please input password" id="registerpassword" name="registerpassword"/>
<!--<label class="">确认密码</label><span class="">*</span>-->
<input class="" type="password" placeholder="Please confirm password" name="rPassword" id="rPassword"/>
<p> <button onclick="submitForm()" class="register">提交</button></p>
<p style="margin-top: 15px;"><a onclick="loginCallBack()">返回登录页</a></p>
</div>
<div class="clear"></div>
</div>
</div>
</div>
</body>
<script type="text/javascript" src="/config/jquery.min.js"></script>
<script type="text/javascript">
function loginCallBack() {
var test = window.location.href;
var suffix = test.substr(test.indexOf("https"));
window.location.href=suffix;
}
function forget() {
var test = window.location.href;
var suffix = test.substr(test.indexOf("https"));
document.getElementById("forgetPassword").href=suffix;
$("#forgetPassword" ).trigger( "click" );
}
function submitForm() {
var userName = $("#username").val();
var code = $("#code").val();
var registerpassword = $("#registerpassword").val();
var rPassword = $("#rPassword").val();
if (!userName || userName.trim() == "") {
alert("请输入用户名");
return;
}else if(!code || code.trim() == ""){
alert("请输入验证码");
return;
}else if(!registerpassword || registerpassword.trim() == ""){
alert("请输入新密码");
return;
}else if(!rPassword || rPassword.trim() == ""){
alert("请输入确认新密码");
return;
}else if(rPassword!= registerpassword){
alert("两次密码输入不一致");
return;
}
$.ajax({
url: "/config/updatePassWprd",
async: true,
cache: false,
type: "post",
dataType: "json",
data: {
username:userName,
code:code,
password:registerpassword
},
success: function (data) {
var result = data.data;
if (data.success) {
alert(result);
var test = window.location.href;
var suffix = test.substr(test.indexOf("https"));
window.location.href=suffix;
}else{
alert(result);
}
}
});
}
function sendCode() {
var userName = $("#username").val();
if (!userName || userName.trim() == "") {
alert("请输入用户名");
return;
} else {
userName = userName.trim();
/*$('#code-button').button('loading').delay(1000).queue(function () {
});*/
$.ajax({
url: "/config/sendEmailCode",
async: true,
cache: false,
type: "post",
dataType: "json",
data: {
username:userName
},
// data: JSON.stringify($("#login_form").serializeJson()),
success: function (data) {
var result = data.data;
if (data.success) {
alert("发送成功");
// window.location.href=result.backUrl;
$('#code-button').attr("data-loading-text", "发送成功");
$('#code-button').text("发送成功");
}else{
alert(result);
$('#code-button').text("重新发送");
}
}
});
/*
$.cusPost("/sendEmailCode", {
username: userName
}, function (res) {
if (res.success) {
toastr.success("发送成功");
$('#code-button').attr("data-loading-text", "发送成功");
$('#code-button').text("发送成功");
} else {
toastr.error($.cusEval(res.messege));
$('#code-button').button('reset');
}
});*/
}
window.event.returnValue = false;
}
</script>
</html>
public class EmailCode implements Serializable {
private static final long serialVersionUID = 2219671763588217991L;
private Integer id;
private String email;
private String code;
//过期时间
private Timestamp expireTime;
//是否使用
private Boolean isUsed;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public Timestamp getExpireTime() {
return expireTime;
}
public void setExpireTime(Timestamp expireTime) {
this.expireTime = expireTime;
}
public Boolean getIsUsed() {
return isUsed;
}
public void setIsUsed(Boolean isUsed) {
this.isUsed = isUsed;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
package com.carl.auth.sso.config.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.List;
import java.util.Map;
import java.util.UUID;
@Service
public class EmailCodeService {
@Autowired
private MailService mailService;
public Boolean sendVaildateCode(String toEmail) {
String code = getVerificationCode();
/*List<EmailCode> list = emailCodeRepository.findByEmailAndIsUsedAndExpireTimeGreaterThan(toEmail, false,
new Timestamp(System.currentTimeMillis()));*/
List<Map<String,Object>> list=Demo1.findByEmailAndIsUsedAndExpireTimeGreaterThan(toEmail, false, new Timestamp(System.currentTimeMillis()));
if(list.size()>0) {
Map<String, Object> map = list.get(0);
code=map.get("code").toString();
}else{
addEmailCode(toEmail, code);
}
String content = getContent(code);
return mailService.sendHtmlMail(toEmail, "算法模型训练 : 忘记密码", content);
}
public Boolean sendVaildateCodeRegist(String toEmail) {
String code = getVerificationCode();
/*List<EmailCode> list = emailCodeRepository.findByEmailAndIsUsedAndExpireTimeGreaterThan(toEmail, false,
new Timestamp(System.currentTimeMillis()));*/
List<Map<String,Object>> list=Demo1.findByEmailAndIsUsedAndExpireTimeGreaterThanRegist(toEmail, false, new Timestamp(System.currentTimeMillis()));
if(list.size()>0) {
Map<String, Object> map = list.get(0);
code=map.get("code").toString();
}else{
addEmailCodeRegist(toEmail, code);
}
String content = getContent(code);
return mailService.sendHtmlMail(toEmail, "算法模型训练 : 忘记密码", content);
}
public static String getVerificationCode() {
String uuid = UUID.randomUUID().toString();
return uuid.substring(0, 6);
}
public void addEmailCode(String email, String code) {
EmailCode emailCode = new EmailCode();
emailCode.setEmail(email);
emailCode.setCode(code);
// 三十分钟
emailCode.setExpireTime(new Timestamp(System.currentTimeMillis() + 30 * 60 * 1000));
emailCode.setIsUsed(false);
Demo1.saveExpireTime(emailCode);
}
public void addEmailCodeRegist(String email, String code) {
EmailCode emailCode = new EmailCode();
emailCode.setEmail(email);
emailCode.setCode(code);
// 三十分钟
emailCode.setExpireTime(new Timestamp(System.currentTimeMillis() + 30 * 60 * 1000));
emailCode.setIsUsed(false);
Demo1.saveExpireTimeRegist(emailCode);
}
public String getContent(String code) {
String html = "<!DOCTYPE html><html><head><meta charset=\"UTF-8\"><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />"
+ "</head><body><p>您的验证码是:" + code + ",有效期为30分钟。</p></body></html>";
return html;
}
/*public void forgetPassword(Map<String, Object> map) throws Exception {
String username = map.get("username").toString();
CasUser user = userRepository.findUserByUsername(username);
if (user == null) {
throw new UnknownAccountException();
}
String email = user.getEmail();
String code = map.get("code").toString();
EmailCode emailCode = emailCodeRepository.findByEmailAndCodeAndIsUsedOrderById(email, code, false);
if (emailCode == null) {
throw new UnknownCodeException();
}
if (System.currentTimeMillis() > emailCode.getExpireTime().getTime()) {
throw new OverdueCodeException();
}
String password = new SimpleHash(ShiroConstant.ALGORITHMNAME, map.get("password").toString(),
ByteSource.Util.bytes(username), ShiroConstant.HASHITERATIONS).toString();
user.setPassword(password);
userRepository.save(user);
//TODO bbs用户
bbsService.updatePassword(username, password);
emailCode.setIsUsed(true);
emailCodeRepository.save(emailCode);
}*/
}
package com.carl.auth.sso.config.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
@Service
public class MailService {
private Logger log = LoggerFactory.getLogger(MailService.class);
@Autowired
private JavaMailSender sender;
@Value("${spring.mail.username}")
private String username;
public Boolean sendHtmlMail(String to, String subject, String content) {
MimeMessage message = sender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(username);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);
sender.send(message);
log.info("html邮件已经发送。");
return true;
} catch (MessagingException e) {
e.printStackTrace();
log.error("发送html邮件时发生异常!", e);
return false;
}
}
}
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>3.2.6.RELEASE</version>
</dependency>
但是,这样还是不行,你可能会遇到的问题
nested exception is:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target. Failed messages: javax.mail.MessagingException: Could not connect to SMTP host: smtp.qq.com, port: 465;
nested exception is:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target; message exceptions (1) are:
Failed message 1: javax.mail.MessagingException: Could not connect to SMTP host: smtp.qq.com, port: 465;
nested exception is:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target] with root cause
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:145) ~[na:1.8.0_40]
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:131) ~[na:1.8.0_40]
at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280) ~[na:1.8.0_40]
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:382) ~[na:1.8.0_40]
at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292) ~[na:1.8.0_40]
at sun.security.validator.Validator.validate(Validator.java:260) ~[na:1.8.0_40]
at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324) ~[na:1.8.0_40]
at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229) ~[na:1.8.0_40]
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124) ~[na:1.8.0_40]
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1460) ~[na:1.8.0_40]
at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:212) ~[na:1.8.0_40]
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:969) ~[na:1.8.0_40]
at sun.security.ssl.Handshaker.process_record(Handshaker.java:904) ~[na:1.8.0_40]
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1050) ~[na:1.8.0_40]
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1363) ~[na:1.8.0_40]
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1391) ~[na:1.8.0_40]
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1375) ~[na:1.8.0_40]
at com.sun.mail.util.SocketFetcher.configureSSLSocket(SocketFetcher.java:549) ~[mail-1.4.7.jar:1.4.7]
at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:354) ~[mail-1.4.7.jar:1.4.7]
at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:237) ~[mail-1.4.7.jar:1.4.7]
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1927) ~[mail-1.4.7.jar:1.4.7]
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:654) ~[mail-1.4.7.jar:1.4.7]
at javax.mail.Service.connect(Service.java:295) ~[mail-1.4.7.jar:1.4.7]
at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:389) ~[spring-context-support-3.2.6.RELEASE.jar:3.2.6.RELEASE]
at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:340) ~[spring-context-support-3.2.6.RELEASE.jar:3.2.6.RELEASE]
at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:336) ~[spring-context-support-3.2.6.RELEASE.jar:3.2.6.RELEASE]
at com.carl.auth.sso.config.controller.MailService.sendHtmlMail(MailService.java:34) ~[classes/:na]
at com.carl.auth.sso.config.controller.EmailCodeService.sendVaildateCode(EmailCodeService.java:35) ~[classes/:na]
at com.carl.auth.sso.config.controller.CasVerifyController.sendEmailCode(CasVerifyController.java:154) ~[classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_40]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_40]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_40]
at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_40]
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133) ~[spring-web-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97) ~[spring-webmvc-4.3.8.RELEASE.jar:4.3.8.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) ~[spring-webmvc-4.3.8.RELEASE.jar:4.3.8.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) ~[spring-webmvc-4.3.8.RELEASE.jar:4.3.8.RELEASE]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) ~[spring-webmvc-4.3.8.RELEASE.jar:4.3.8.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) ~[spring-webmvc-4.3.8.RELEASE.jar:4.3.8.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) ~[spring-webmvc-4.3.8.RELEASE.jar:4.3.8.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) ~[spring-webmvc-4.3.8.RELEASE.jar:4.3.8.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872) ~[spring-webmvc-4.3.8.RELEASE.jar:4.3.8.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:661) ~[tomcat-embed-core-8.5.14.jar:8.5.14]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) ~[spring-webmvc-4.3.8.RELEASE.jar:4.3.8.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) ~[tomcat-embed-core-8.5.14.jar:8.5.14]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-8.5.14.jar:8.5.14]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.14.jar:8.5.14]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) ~[tomcat-embed-websocket-8.5.14.jar:8.5.14]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.14.jar:8.5.14]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.14.jar:8.5.14]
at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:55) ~[spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.14.jar:8.5.14]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.14.jar:8.5.14]
at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:110) ~[spring-boot-actuator-1.5.3.RELEASE.jar:1.5.3.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.14.jar:8.5.14]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.14.jar:8.5.14]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) ~[spring-web-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.14.jar:8.5.14]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.14.jar:8.5.14]
at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:108) ~[spring-web-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.14.jar:8.5.14]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.14.jar:8.5.14]
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81) ~[spring-web-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.14.jar:8.5.14]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.14.jar:8.5.14]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197) ~[spring-web-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.14.jar:8.5.14]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.14.jar:8.5.14]
at org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:106) ~[spring-boot-actuator-1.5.3.RELEASE.jar:1.5.3.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.14.jar:8.5.14]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.14.jar:8.5.14]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) ~[tomcat-embed-core-8.5.14.jar:8.5.14]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-8.5.14.jar:8.5.14]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478) [tomcat-embed-core-8.5.14.jar:8.5.14]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) [tomcat-embed-core-8.5.14.jar:8.5.14]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80) [tomcat-embed-core-8.5.14.jar:8.5.14]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [tomcat-embed-core-8.5.14.jar:8.5.14]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) [tomcat-embed-core-8.5.14.jar:8.5.14]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799) [tomcat-embed-core-8.5.14.jar:8.5.14]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.14.jar:8.5.14]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861) [tomcat-embed-core-8.5.14.jar:8.5.14]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455) [tomcat-embed-core-8.5.14.jar:8.5.14]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.14.jar:8.5.14]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_40]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_40]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.14.jar:8.5.14]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_40]
解决方法:
package com.carl.auth.sso.config.controller;
import java.io.*;
import java.net.URL;
import java.security.*;
import java.security.cert.*;
import javax.net.ssl.*;
public class InstallCert {
public static void main(String[] args) throws Exception {
System.out.println("this is ppppppppppppppppppppppppppp");
String host;
int port;
char[] passphrase;
if ((args.length == 1) || (args.length == 2)) {
String[] c = args[0].split(":");
host = c[0];
port = (c.length == 1) ? 443 : Integer.parseInt(c[1]);
String p = (args.length == 1) ? "changeit" : args[1];
passphrase = p.toCharArray();
} else {
System.out.println("Usage: java InstallCert [:port] [passphrase]");
return;
}
File file = new File("jssecacerts");
if (file.isFile() == false) {
char SEP = File.separatorChar;
File dir = new File(System.getProperty("java.home") + SEP
+ "lib" + SEP + "security");
file = new File(dir, "jssecacerts");
if (file.isFile() == false) {
file = new File(dir, "cacerts");
}
}
System.out.println("Loading KeyStore " + file + "...");
InputStream in = new FileInputStream(file);
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(in, passphrase);
in.close();
SSLContext context = SSLContext.getInstance("TLS");
TrustManagerFactory tmf =
TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ks);
X509TrustManager defaultTrustManager = (X509TrustManager)tmf.getTrustManagers()[0];
SavingTrustManager tm = new SavingTrustManager(defaultTrustManager);
context.init(null, new TrustManager[] {tm}, null);
SSLSocketFactory factory = context.getSocketFactory();
System.out.println("Opening connection to " + host + ":" + port + "...");
SSLSocket socket = (SSLSocket)factory.createSocket(host, port);
socket.setSoTimeout(10000);
try {
System.out.println("Starting SSL handshake...");
socket.startHandshake();
socket.close();
System.out.println();
System.out.println("No errors, certificate is already trusted");
} catch (SSLException e) {
System.out.println();
e.printStackTrace(System.out);
}
X509Certificate[] chain = tm.chain;
if (chain == null) {
System.out.println("Could not obtain server certificate chain");
return;
}
BufferedReader reader =
new BufferedReader(new InputStreamReader(System.in));
System.out.println();
System.out.println("Server sent " + chain.length + " certificate(s):");
System.out.println();
MessageDigest sha1 = MessageDigest.getInstance("SHA1");
MessageDigest md5 = MessageDigest.getInstance("MD5");
for (int i = 0; i < chain.length; i++) {
X509Certificate cert = chain[i];
System.out.println
(" " + (i + 1) + " Subject " + cert.getSubjectDN());
System.out.println(" Issuer " + cert.getIssuerDN());
sha1.update(cert.getEncoded());
System.out.println(" sha1 " + toHexString(sha1.digest()));
md5.update(cert.getEncoded());
System.out.println(" md5 " + toHexString(md5.digest()));
System.out.println();
}
System.out.println("Enter certificate to add to trusted keystore or 'q' to quit: [1]");
String line = reader.readLine().trim();
int k;
try {
k = (line.length() == 0) ? 0 : Integer.parseInt(line) - 1;
} catch (NumberFormatException e) {
System.out.println("KeyStore not changed");
return;
}
X509Certificate cert = chain[k];
String alias = host + "-" + (k + 1);
ks.setCertificateEntry(alias, cert);
OutputStream out = new FileOutputStream("jssecacerts");
ks.store(out, passphrase);
out.close();
System.out.println();
System.out.println(cert);
System.out.println();
System.out.println
("Added certificate to keystore 'jssecacerts' using alias '"
+ alias + "'");
}
private static final char[] HEXDIGITS = "0123456789abcdef".toCharArray();
private static String toHexString(byte[] bytes) {
StringBuilder sb = new StringBuilder(bytes.length * 3);
for (int b : bytes) {
b &= 0xff;
sb.append(HEXDIGITS[b >> 4]);
sb.append(HEXDIGITS[b & 15]);
sb.append(' ');
}
return sb.toString();
}
private static class SavingTrustManager implements X509TrustManager {
private final X509TrustManager tm;
private X509Certificate[] chain;
SavingTrustManager(X509TrustManager tm) {
this.tm = tm;
}
public X509Certificate[] getAcceptedIssuers() {
throw new UnsupportedOperationException();
}
public void checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
throw new UnsupportedOperationException();
}
public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
this.chain = chain;
tm.checkServerTrusted(chain, authType);
}
}
}
安装此证书 运行 java InstallCert smtp.xyz.com:465 运行后按“1”即可得到jssecacerts文件后复制到jdk1.6.0_14\jre\lib\security目录
怎么运行呢?
先注意看我这个文件包的位置,再看我运行的代码
javac InstallCert.java 得到InstallCert.class文件
E:\ideaCas\caslocalhost\sso-config\src\main\java>java com.carl.auth.sso.config.controller.InstallCert smtp.exmail.qq.com:465
运行方式附赠另一位博主的微博