我正试图在单声道上使用.NET(F#)访问https://geocoder.cit.api.here.com。我正在使用Http
中的FSharp.Data
帮助程序,使用以下代码:
let baseUrl = "https://geocoder.cit.api.here.com/6.2/geocode.json?searchtext=1701%20McFarland%20Blvd%20E%20Tuscaloosa%09%20AL&app_id=<Some app id>&app_code=<Some app code>"
let res = Http.RequestString(baseUrl)
在OSX Sierra(10.12.2)上以单声道版本4.6.2为我运行这个产生SecureChannelFailure
。我该如何解决这个问题?我试过mozroots --import --ask-remove
,但没有帮助。 ~/.config/.mono/certs/Trust
中有证书。
我甚至试图绕过检查,因为我只是在调查API,但这也不起作用。我试图绕过它的方式是:
let callback = Security.RemoteCertificateValidationCallback(fun _ _ _ _ -> true)
ServicePointManager.ServerCertificateValidationCallback <- callback
答案 0 :(得分:3)
使用Mono 4.8 + ,您可以在运行基于CIL的MONO_TLS_PROVIDER
之前将环境变量btls
分配给.exe
:
export MONO_TLS_PROVIDER=btls
mono someFSharpAssembly.exe
通过Xamarin Studio / Visual Studio for Mac将其分配给运行配置:
如果您获得HttpRequestException
:
Error: TrustFailure (Ssl error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED) ---> Mono.Btls.MonoBtlsException
这意味着您没有新格式的证书。运行“btls-cert-sync”工具将现有的根证书转换为新的文件格式。如果“btls-cert-sync”抱怨“旧信任存储不存在”,您首先需要告诉Mono如何查找这些证书,本页描述了如何执行此操作: