Я пишу приложение, использующее API геолокации . Одним из требований этого API является то, что он должен использоваться поверх HTTPS.
Следующий сценарий оболочки показывает процесс, который я использовал для настройки HTTPS для localhost:
echo "Started local certificate setup script."
# Generate a private 2048-bit RSA key and encrypt it using triple DES before outputting it
openssl genrsa -des3 -out rootCA.key 2048
# Create a root CA public certificate
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 825 -out rootCA.pem
# Create a new certificate signing request (CSR) and a new private key
openssl req -new -sha256 -nodes -out server.csr -newkey rsa:2048 -keyout server.key -config server.csr.cnf
# Using the previously generated CSR, and the root CA cert, generate a server.crt which will be the certificate file we use for localhost
openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 825 -sha256 -extfile v3.ext
echo "Trust the root certificate (add it to the system keychain): "
sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain rootCA.pem # macOS specific step
Начальные файлы в приведенных выше командах OpenSSL находятся здесь:
v3.ext
:
authorityKeyIdentifier = keyid, issuer
basicConstraints = CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = localhost
server.csr.cnf
:
[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
[dn]
C=CA
ST=RandomProvince
L=RandomCity
O=RandomOrganization
OU=RandomOrganizationUnit
emailAddress=admin@whatever.com
CN = localhost
Это отлично работает для локальных разработка Chrome (в настоящее время версия 83.0.4103.116). Мы видим, что получаем самоподписанный сертификат root, и Chrome доверяет ему:
Chrome also trusts the localhost certificate which uses this root CA that we've created for local development:
However, there are times when I'd like to also run locally using Firefox. Whenever I'm using Firefox I get the following: SEC_ERROR_UNKNOWN_ISSUER
. I can get past this error in Firefox by using about:config
and then turning security.enterprise_roots.enabled
to true
. At this point Firefox doesn't complain at all about the certificate - but all requests for the user location result in permission denied errors.
Even clicking "Allow Location Access" in the following pop-up results in the geolocation API thowing an error saying that permission was denined to access the user location:
введите описание изображения здесь
Я использую следующую функцию для получения местоположения (аргумент контекста, поскольку он находится в проекте Vue. js с использованием Vuex):
findCurrentPosition(context) {
const options = {
timeout: 20000,
enableHighAccuracy: false,
maximumAge: Infinity,
}
return new Promise((resolve, reject) => {
if ('geolocation' in navigator) {
navigator.geolocation.getCurrentPosition(
position => {
const lat = position.coords.latitude
const lon = position.coords.longitude
setLocation(context, [lat, lon])
resolve([lat, lon])
},
error => {
switch (error.code) {
case error.PERMISSION_DENIED:
console.log('User denied the request for Geolocation.') // in Firefox, even after explicitly allowing location access, this is always hit
break
case error.POSITION_UNAVAILABLE:
case error.TIMEOUT:
case error.UNKNOWN_ERROR:
// get location another way
}
reject([])
},
options,
)
} else {
// get location another way
}
})
}
Как можно Я использую API геолокации в Firefox при локальной разработке? Я отключил все расширения Firefox, чтобы исключить возможность того, что одно из них мешает определению местоположения.