使用Microsoft Azure Identity认证时Safari提示“非安全表单”如何解决?
解决Microsoft Graph交互式认证的浏览器安全提示及HTTPS报错问题
问题根源
你遇到的问题本质是浏览器对**非安全上下文(HTTP协议)**的限制:
- Safari对HTTP环境下的表单提交校验更严格,直接标记为"表单不安全";
- Chrome虽然无弹窗,但HTTP的localhost会被标记为不安全站点;
- 直接改用HTTPS后,由于本地服务没有受信任的SSL证书,MSAL库会触发证书验证失败的报错。
解决方案步骤
1. 生成本地自签名SSL证书
推荐使用mkcert工具生成受本地浏览器和JVM信任的自签名证书,步骤如下:
- 安装
mkcert(可通过包管理器或官方渠道下载) - 生成localhost证书:
执行后会得到mkcert localhostlocalhost.pem(证书文件)和localhost-key.pem(私钥文件)。
2. 转换证书为Java兼容的Keystore格式
MSAL Java依赖JVM的SSL信任存储,需要将证书转换为PKCS12格式:
openssl pkcs12 -export -in localhost.pem -inkey localhost-key.pem -out keystore.p12 -name "localhost"
执行时设置一个自定义密码(比如password123),后续启动应用会用到。
3. 调整应用代码及Azure AD配置
- 修改
InteractiveBrowserCredentialBuilder的重定向URL为HTTPS:credential = new InteractiveBrowserCredentialBuilder() .clientId(clientId) .tenantId(tenantId) .redirectUrl("https://localhost:4242") .tokenCachePersistenceOptions(new TokenCachePersistenceOptions()) .build(); _userClient = new GraphServiceClient(credential, graphUserScopes); - 登录Azure门户,找到你的应用注册,在认证页面添加
https://localhost:4242作为重定向URI并保存。
4. 启动Java应用时指定SSL参数
在启动应用的VM参数中添加以下配置,让JVM信任我们生成的证书:
-Djavax.net.ssl.keyStore=./keystore.p12 -Djavax.net.ssl.keyStorePassword=password123 -Djavax.net.ssl.trustStore=./keystore.p12 -Djavax.net.ssl.trustStorePassword=password123
注意替换password123为你之前设置的Keystore密码,确保keystore.p12路径正确。
验证效果
- 启动应用后,交互式认证会打开HTTPS的localhost回调地址,浏览器会信任这个自签名证书(
mkcert已将根证书添加到本地信任存储); - Safari不再弹出"表单不安全"提示,Chrome地址栏也会显示安全标识;
- MSAL库不会再触发SSL证书验证报错,认证及API调用正常。
内容的提问来源于stack exchange,提问作者pro-kswe
相关产品推荐
相关产品推荐

