Uso de mapas OpenLayers con SSL

10

Estoy usando el mapa OpenLayers usando el JavaScript alojado:

<script src="http://openlayers.org/api/2.13.1/OpenLayers.js"></script> 

Pero mi cliente tiene SSL instalado y cuando trato de ejecutar mi página de mapa muestra:

(2)[blocked] The page at https://domain.com/rwd/ ran insecure content 
   from http://openlayers.org/api/2.13.1/OpenLayers.js.

Así que probé https one y resulta que Openlayers no tiene uno

https://openlayers.org/api/2.13.1/OpenLayers.js

Luego descargo el Openstreet js y lo alojo en el servidor del cliente, pero luego se pierden todos los estilos e imágenes relacionadas. Aunque muestra el mapa, básicamente aparecen numerosas advertencias en la consola y me temo que esto podría ser rechazado en Play Store más o menos. Estoy desarrollando una aplicación híbrida que también se ejecuta en el servidor.

Advertencias ahora :

The page at https://domain.com/rwd/#/customer-plot/234 displayed insecure content from http://b.tile.openstreetmap.org/14/8743/5624.png.
The page at https://domain.com/rwd/#/customer-plot/234 displayed insecure content from http://b.tile.openstreetmap.org/14/8742/5624.png.
The page at https://domain.com/rwd/#/customer-plot/234 displayed insecure content from http://c.tile.openstreetmap.org/14/8743/5623.png.
The page at https://domain.com/rwd/#/customer-plot/234 displayed insecure content from http://b.tile.openstreetmap.org/14/8743/5625.png.
The page at https://domain.com/rwd/#/customer-plot/234 displayed insecure content from http://c.tile.openstreetmap.org/14/8744/5624.png.
The page at https://domain.com/rwd/#/customer-plot/234 displayed insecure content from http://a.tile.openstreetmap.org/14/8742/5623.png.
The page at https://domain.com/rwd/#/customer-plot/234 displayed insecure content from http://c.tile.openstreetmap.org/14/8742/5625.png.
The page at https://domain.com/rwd/#/customer-plot/234 displayed insecure content from http://a.tile.openstreetmap.org/14/8744/5623.png.
The page at https://domain.com/rwd/#/customer-plot/234 displayed insecure content from http://a.tile.openstreetmap.org/14/8744/5625.png.
The page at https://domain.com/rwd/#/customer-plot/234 displayed insecure content from http://a.tile.openstreetmap.org/14/8743/5622.png.
The page at https://domain.com/rwd/#/customer-plot/234 displayed insecure content from http://c.tile.openstreetmap.org/14/8742/5622.png.
The page at https://domain.com/rwd/#/customer-plot/234 displayed insecure content from http://c.tile.openstreetmap.org/14/8745/5624.png.
The page at https://domain.com/rwd/#/customer-plot/234 displayed insecure content from http://b.tile.openstreetmap.org/14/8744/5622.png.
The page at https://domain.com/rwd/#/customer-plot/234 displayed insecure content from http://b.tile.openstreetmap.org/14/8745/5623.png.
The page at https://domain.com/rwd/#/customer-plot/234 displayed insecure content from http://c.tile.openstreetmap.org/14/8745/5625.png.
The page at https://domain.com/rwd/#/customer-plot/234 displayed insecure content from http://c.tile.openstreetmap.org/14/8745/5622.png.

GET https://domain.com/rwd/js/lib/theme/default/style.css 404 (Not Found) 
/*This the corresponding stylesheet that is loaded via Openstreet.js*/ 

Intenté con cdn con SSL y aún el mismo problema:

https://cdnjs.cloudflare.com/ajax/libs/openlayers/2.11/OpenLayers.js

Descargué todo el repositorio de GitHub para Openstreet pensando que esto resolverá el problema de imagen y CSS.

https://github.com/openlayers/openlayers

Si bien lo anterior resolvió los problemas de CSS , sin embargo, el mapa se muestra cargando imágenes de otro sitio externo tile.openstreet.com. Parece que tengo que cavar en openstreet js también ... :( ..


Importante : estoy usando backbone.js.

Nota : He pasado por problemas de autenticación básica de OpenLayers 2.12 y http y eso no me ha ayudado. No tengo ningún control sobre la configuración del servidor. Solo tengo acceso a una carpeta donde necesito configurar el sitio web y todo lo demás funciona bien, pero este SSL es problemático.

Se cambió la dirección real del sitio web para evitar que Google lo vincule.

Roy MJ
fuente
2
¿Hay alguna razón por la que no aloja el archivo .JS en sus propios servidores? Eso permitiría SSL puro y evitaría conflictos entre dominios.
Mapper
@Mapper: Lo hice primero, pero luego el script muestra algunos recursos externos como css, imágenes, etc. Vea mi segunda actualización. He explicado lo que falta ahora ... Creo que esto seguirá siendo un problema a menos que también agreguen un SSL ...
Roy MJ
Todos los activos, etc. están relacionados entre sí, por lo que en mi humilde opinión no hay problema. Por ejemplo: on-i.de/map
Mapper
@Mapper: Sí, lo descubrí ... pero, sin embargo, las baldosas son las que me atrapan yendo por este camino ... No interrumpe mi aplicación, pero muestra una advertencia, muchas advertencias en realidad ... Mantendré esto abierto por un tiempo unos días para buscar y ver si hay alguna solución posible para esto ...
Roy MJ
Siempre debe alojar esos archivos js localmente. De lo contrario, una actualización de OpenLayers con una modificación de API podría arruinar su sitio.
scai

Respuestas:

11
  • OpenLayers.js: recomendaría descargar la lib y vincularla a su servidor de aplicaciones. De esta manera, puede tener un control total sobre su URL y contenido.

  • advertencias de "contenido inseguro": eso también me pasó a mí. En OpenLayers 2.13.1, cuando crea una instancia de OpenLayers.Layer.OSM, se configura de manera predeterminada para HTTP. De OpenLayers.Layer.OSM doc :

url {String} El esquema de URL del conjunto de mosaicos. El valor predeterminado es http: // [a | b | c] .tile.openstreetmap.org / $ {z} / $ {x} / $ {y} .png

En lugar de eso, utilicé valores explícitos para la matriz de esquema de URL, que contiene URL independientes del protocolo

layer = new OpenLayers.Layer.OSM(
    "OpenStreetMap", 
    // Official OSM tileset as protocol-independent URLs
    [
        '//a.tile.openstreetmap.org/${z}/${x}/${y}.png',
        '//b.tile.openstreetmap.org/${z}/${x}/${y}.png',
        '//c.tile.openstreetmap.org/${z}/${x}/${y}.png'
    ], 
    null);
  • URL independientes del protocolo: si desea que su aplicación se ejecute en HTTP y HTTPS, use URL independientes del protocolo: en lugar de http://server.com/resource , use //server.com/resource : su navegador considerará protocolo en el que se está ejecutando actualmente.
Andrei Cojocaru
fuente
En caso de que alguien se pregunte: puede cambiar esto en el código fuente de OpenLayers.js. Incluso si ya está minimizado, es fácil de encontrar y cambiar.
trainoasis
3

Los servidores de mosaicos oficiales de OSM no proporcionan ningún acceso a través de SSL. Son bienes públicos compartidos y no deben ser utilizados por aplicaciones con mucho tráfico. Si desea usarlos de todos modos, debe estar de acuerdo con el mensaje "algunos contenidos no están encriptados" en los navegadores.

Si desea tener un cifrado completo, debe pagar por los CDN de mapas comerciales con SSL:

Mapper
fuente
3
Esta información es aparentemente antigua. Openstreetmap ahora es compatible con https; revisa openstreetmap.org . Ver también github.com/openstreetmap/openstreetmap-website/issues/1033
Antonis Christofides
1

Necesita anular los formularios Widget. Ejemplo:

from django.contrib import admin
from django.contrib.gis.db import models
from django.contrib.gis.forms.widgets import BaseGeometryWidget

class CustomOpenLayersWidget(BaseGeometryWidget):
    template_name = 'gis/openlayers.html'

    def __init__(self, attrs=None):
        super(CustomOpenLayersWidget, self).__init__(attrs)

    class Media:
        js = (
            'https://cdnjs.cloudflare.com/ajax/libs/openlayers/2.13.1/OpenLayers.js',
            'gis/js/OLMapWidget.js',
        )


class CustomModelAdmin(admin.ModelAdmin):
    """Need to change default URL of OpenLayers"""
    formfield_overrides = {
        models.PointField: {"widget": CustomOpenLayersWidget},
        models.PointField: {"widget": CustomOpenLayersWidget},
        models.PolygonField: {"widget": CustomOpenLayersWidget},
        models.LineStringField: {"widget": CustomOpenLayersWidget},

        # Adding other models Fields if need
    }

y cambiar la clase de administrador

@admin.register(Position)
class PositionAdmin(CustomModelAdmin):
    pass

Un ejemplo de modelo

class Position(models.Model):
    point = models.PointField(blank=False)

El campo de anulación de código forma widgets para una nueva iteración multimedia. Esto elimina el contenido http http://openlayers.org/api/2.13.1/OpenLayers.jsde los medios.

Jones
fuente